如何知道 float 变量何时停止增加 0.001?
How to know when a float variable is going to stop increasing by 0.001?
我想知道如果我将它增加 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;
}
谁能帮我确定一个变量何时停止增加? (独立地,如果它是一个浮点数或一个双精度数,想法是有一个浮动逗号变量)。
您的 time 变量默认大于 max 变量。
真的很简单:
如果时间从 215100 开始,时间永远不会等于最大值,而最大值是 100000,只要您向时间添加一些正数。此外,由于浮点数不精确,比较浮点数有点问题。
回答你的方程式问题:
如果
添加将完全失败
[(log a)/(log 2)]<[((log b)/(log 2))^-c]
在哪里
- a是你要添加的小浮点数
- b 是您要添加的大型公寓
- c为尾数长度(浮点数为23)
在 time
变得足够大以至于其 ULP (unit in the last place) 的大小大于您的 delta
.
我想知道如果我将它增加 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;
}
谁能帮我确定一个变量何时停止增加? (独立地,如果它是一个浮点数或一个双精度数,想法是有一个浮动逗号变量)。
您的 time 变量默认大于 max 变量。
真的很简单: 如果时间从 215100 开始,时间永远不会等于最大值,而最大值是 100000,只要您向时间添加一些正数。此外,由于浮点数不精确,比较浮点数有点问题。
回答你的方程式问题: 如果
添加将完全失败[(log a)/(log 2)]<[((log b)/(log 2))^-c]
在哪里
- a是你要添加的小浮点数
- b 是您要添加的大型公寓
- c为尾数长度(浮点数为23)
在 time
变得足够大以至于其 ULP (unit in the last place) 的大小大于您的 delta
.