你能在多长时间内增加32位浮点数?

时间:2015-11-11 18:12:42

标签: floating-point computer-science precision

如果你一次又一次地增加一个浮点数,从0开始,它会在哪里停止?

float myfloat = 0.0;
float lastfloat = -1;
while(lastfloat != myfloat) {
    lastfloat = myfloat;
    myfloat += 1.0;
}
cout << "myfloat: " << myfloat << endl;

澄清:通过停止,我决定浮动的价值何时停止改变。在某些时候,浮点值达到一个值,因此它不能表示更高的值。我想知道这个价值。我不能二进制搜索它,因为没有明确的差异,运行代码来查找可能需要很长时间,特别是对于64位浮点数。

2 个答案:

答案 0 :(得分:2)

永远不会停止;最终,myfloat将是如此之大,以至于添加1将不会改变它(如果你希望通过某种溢出错误来阻止循环)。由于你没有其他停止循环的机制,它不会。

答案 1 :(得分:-1)

常规签名浮点数具有以下字节分段:

  • 1位用于标志
  • 指数
  • 的8位
  • 分数
  • 的23位

你需要经过的增量为2 ^ 8位,相当于 2 ^(16 * 8-1)= 1.7014 * 10 ^ 38
你将不得不迭代1.704 * 10 ^ 38次然后才会回到浮动的负面,即 2 ^ - (16 * 8-2)= 1.1754 ^ 38