如果可以用IEEE 754中的二进制格式表示硬编码是否精确浮动?

ggr*_*grr 9 c c++ floating-point precision floating-accuracy

例如,0,0.5,0.15625,1,2,3 ......是从IEEE 754转换而来的值.它们的硬编码版本是否精确?

例如:

float a=0;
if(a==0){
    return true;
}
Run Code Online (Sandbox Code Playgroud)

总是回归真实?其他例子:

float a=0.5;
float b=0.25;
float c=0.125;
Run Code Online (Sandbox Code Playgroud)

a*b总是等于0.125而a*b == c总是如此?还有一个例子:

int a=123;
float b=0.5;
Run Code Online (Sandbox Code Playgroud)

a*b总是61.5?或者一般来说,整数乘以IEEE 754二进制浮点精确?

或者更一般的问题:如果值是硬编码并且值和结果都可以用IEEE 754中的二进制格式表示(例如:0.5 - 0.125),那么值是否精确?

Tho*_*thy 7

浮点数没有固有的模糊性.只是有些(但不是全部)实数无法准确表示.

比较固定宽度的十进制表示,比方说三位数.可以使用1.00表示整数1,并且可以使用0.10表示1/10,但是只能使用0.33来近似1/3.

如果我们改为使用二进制数字,则整数1表示为1.00(二进制数字),1/2表示为0.10,1/4表示为0.01,但1/3可以(再次)仅表示近似值.

但有些事情需要记住:

  • 这不是相同的数字与十进制数字.1/10可以使用十进制数字精确地写为0.1,但不使用二进制数字,无论您使用多少(无穷大).
  • 实际上,很难跟踪哪些数字可以
    表示,哪些不能表示.0.5可以,但0.4不能.因此,当您需要确切的数字时,例如(通常)在使用金钱时,您不应该使用浮点数.
  • 根据一些消息来源,一些处理器在对无法准确表示的数字执行浮点计算时会在内部执行奇怪的操作,从而导致结果以实际上不可预测的方式变化.

(我的看法是,它实际上是一个合理的第一次近似地说,是的,浮点数固有的模糊,所以,除非你确信你的特定应用程序就可以搞定,远离他们.)

有关您可能需要或想要的更多详细信息,请阅读着名的每个计算机科学家应该知道的关于浮点运算的内容.此外,这个更易于访问的网站:浮点指南.

  • @Magisch对不起,但你错了.如果所有提到的处理器都使用IEEE 754并且数字在二进制表示中是有限的,则没有理由提供不同的结果.一旦涉及舍入,可能会有一些差异,但不会更早. (5认同)
  • 关于`一旦你有一个数学运算,其中一个甚至临时结果的数字在浮点数学中没有直接有限地表示,它将是不准确的.好的,但*不可代表的数字并不是每个人都在谈论*. (4认同)
  • @Magisch你的评论是关于完全无关的事情.这就是我要问的原因 (3认同)
  • @Magisch让我再问一遍,fp数学与fp序列化和实时场景有什么关系?如果这个明确,我们可以继续. (2认同)