将 while 循环转化为数学方程?

2023-12-20

我的程序中有两个简单的 while 循环,我认为它们应该是数学方程,但我正在努力转换它们:

float a = someValue;
int b = someOtherValue;
int c = 0;

while (a <= -b / 2) {
    c--;
    a += b;
}
while (a >= b / 2) {
    c++;
    a -= b;
}

这段代码按原样工作,但我觉得它可以简化为数学方程。这里的想法是,此代码采用偏移量 (someValue) 并调整坐标 (c),以最小化与图块(大小为 someOtherValue)中心的距离。任何帮助,将不胜感激。


可以证明以下说法是正确的:

c = floor((a+b/2)/b)
a = a - c*b

请注意,floor 表示向下舍入,朝向负无穷大:而不是朝向 0。(例如,floor(-3.1)=-4。floor()库函数将执行此操作;请确保不要只转换为 int,它通常会向 0 舍入。)

想必b严格为正,因为否则两个循环都不会终止:添加b不会使a更大和减去b不会使a较小。有了这个假设,我们就可以证明上面的代码是有效的。 (paranoidgeek 的代码也几乎是正确的,除了它使用强制转换为 int 而不是floor.)

巧妙的证明方法: 该代码添加或减去的倍数b from a until a is in [-b/2,b/2),您可以将其视为加法或减法integers from a/b until a/b is in [-1/2,1/2),即直到(a/b+1/2)(叫它x) is in [0,1)。由于您仅按整数更改它,因此值x没有改变mod 1,即它转到它的余数模 1,即x-floor(x)。因此,您进行的有效减法次数(即c) is floor(x).

乏味的证明方式:

At the end of the first loop, the value of c is the negative of the number of times the loop runs, i.e.:

  • 0 如果:a > -b/2 a+b/2 > 0
  • -1 如果:-b/2 ≥ a > -3b/2 0 ≥ a+b/2 > -b 0 ≥ x > -1
  • -2 如果:-3b/2≥a > -5b/2 -b ≥ a+b/2 > -2b -1 ≥ x > -2 等等,

where x = (a+b/2)/b,所以 c 为: 0(如果 x>0),否则为“ceiling(x)-1”。如果第一个循环运行了,那么它在第一个循环之前≤ -b/2上次循环已执行,因此现在 ≤ -b/2+b,即 ≤ b/2。根据是否恰好是 b/2(即,是否x当你开始时是否恰好是一个非正整数),第二个循环恰好运行 1 次或 0 次,并且 c 是天花板(x)或天花板(x)-1。这样就解决了第一个循环运行时的情况。

如果第一个循环没有运行,则第二个循环结束时 c 的值为:

  • 0 如果:a a-b/2
  • 1 如果:b/2 ≤ a 0 ≤ a-b/2 0 ≤ y
  • 2 如果:3b/2 ≤ a b ≤ a-b/2 1 ≤ y

where y = (a-b/2)/b,所以 c 为:如果 ya现在肯定是

所以你可以写一个表达式c as:

x = (a+b/2)/b
y = (a-b/2)/b
c = (x≤0)*(ceiling(x) - 1 + (x is integer))
   +(y≥0)*(1 + floor(y))                

当然,接下来你会注意到(ceiling(x)-1+(x is integer))floor(x+1)-1这是floor(x), 然后y实际上是x-1, so (1+floor(y))=floor(x),至于条件:
当x≤0时,不可能有(y≥0),所以c只是第一项floor(x),
当 0 c is 0,
当 1 ≤ x 时,只有 0≤y,所以 c 只是第二项,即floor(x)再次。 所以c =floor(x)在所有情况下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 while 循环转化为数学方程? 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐