C和C++编译器如何实现浮点数相等的决策?

Wiz*_*ann 7 c c++ floating-point-precision

例如,

float a = 1.0;
float b = 1.2;

puts(a == b? "equal": "not equal");
Run Code Online (Sandbox Code Playgroud)

编译器是按位还是通过其他方法处理它?

(我知道通过"=="来确定浮点数的相等性不是一个好的选择,我只是想知道编译器如何处理这种情况.)

Nay*_*uki 5

一般的,完整的答案是根据IEEE 754规范比较浮点数.

要具体回答你的问题,大多数情况下,两个浮点数按位进行比较,只有几个特殊情况:

  • 正负零被认为是相等的
  • NaN被认为是不平等的,甚至对NaN本身也是如此
  • 次归可以比较在某些操作模式等于零和其它次归(例如"刷新次归零")
  • 除了这些例外,使用常规的按位比较

  • ...当然,除非系统不使用IEEE浮点数(例如,某些IBM大型机仍然没有,相当少的GPU不会,至少通常). (3认同)