【问题标题】:How to know when a float variable is going to stop increasing by 0.001?如何知道浮点变量何时停止增加 0.001?
【发布时间】:2016-06-11 19:17:52
【问题描述】:

我想知道如果我将浮点(或双精度)变量增加 0.001 时,如何确定其值将停止增加。

如果我们谈论浮点值的二进制表示:1 位用于符号,8 位指数位和 23 位尾数。我们知道,当我们达到一个确定的高值(32768)然后我们添加一个非常小的值(0.001)时,由于指数的 EXC 127 表示,相加结果将是:

32768 + 0 = 32768

据此,即使我们添加 0.001,变量也将具有相同的值。

下一个代码永远不会中断。

float max =100000;
float delta=0.001F;
float time = 0;
while (time < max)
{
time += delta;
if(time == max)
    break;
}

有人可以帮我确定一个变量以了解变量何时停止增加吗? (独立地,如果它是浮点数或双精度数,想法是有一个浮点逗号变量)。

【问题讨论】:

标签: c# binary double break representation


【解决方案1】:

time 变得足够大以至于其ULP (unit in the last place) 的大小大于您的delta 的大小之后,您的加法将变为幂等(即结果不会改变)。

【讨论】:

    【解决方案2】:

    真的很简单: 如果时间从 215100 开始并且最大值为 100000,那么时间永远不会等于最大值,只要您在时间上添加一些正数。此外,由于浮点数不精确,比较浮点数有点问题。

    要回答您的方程式问题: 添加将完全失败,如果

    [(log a)/(log 2)]<[((log b)/(log 2))^-c]
    

    在哪里

    • a 是您要添加的小浮动
    • b 是您想要添加的大型活动
    • c 是尾数的长度(浮点数为 23)

    【讨论】:

    • @Sebastian 仍然,将浮点数与 == 进行比较是不够的,请使用 >=
    【解决方案3】:

    您的 time 变量默认大于 ma​​x 变量。

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2022-08-16
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多