比较浮点数的总和

Lea*_*der 5 c# unity-game-engine visual-studio

我在 Unity 中运行此代码(带有 .Net 4.x 的 Mono 后端)

float a = 0.42434249394294f;
float b = 1 - a;
float sum = a + b;
bool compare1 = (a + b) >= 1f;
bool compare2 = sum >= 1f;
Run Code Online (Sandbox Code Playgroud)

在调试(使用 Visual Studio)中,compare1falsewhilecompare2true.

这是怎么回事?为什么最后两行不同?我会认为sum == a + b

Lea*_*der 0

这个答案

2.) 浮点中间结果在寄存器中通常使用80位精度,但在内存中仅使用64位精度。

我相信,这sum = a + b会生成一条指令将结果存储在内存中,作为最大 64 位的浮点数。

由于编译器优化,机器代码(a + b) >= 1f似乎没有转换为有限的浮点类型,并且显然使用了更高的位深度,可以观察到数字之和不等于 1。

我们可以通过强制转换来强制内存存储(float)(a+b)

来自 Enigmativity 的评论:

[...]无论是否打开编译器优化,输出都会有所不同。当它开启时,我变得真实而真实。当它关闭时,我变得虚假和真实。