And*_*zos 4 c++ floating-point language-lawyer c++20
C++ 标准说:
如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。
和
二元 / 运算符将第一个表达式除以第二个表达式得出商。如果商 a/b 可以用结果类型表示 [snip];否则,a/b 的行为是未定义的。
如果我有:
double x = 1.0 / 3.0;
Run Code Online (Sandbox Code Playgroud)
1除以3的结果是实数“三分之一”。三分之一无法用结果类型表示(double,通常是 IEEE754 双精度二进制 64 浮点类型)。
这是否意味着上面的语句是一个未定义的操作?当然不可能——但我不明白为什么不是?
这里的“范围”一词是指介于最低和最高可表示值之间。它不是“域”和“范围”中的数学术语。
由于实数值太大(远离零)或太小(非零值太接近零),因此可能超出浮点类型的范围。
浮点类型不精确;这是他们的本性。某些计算产生的值是精确实际值的近似值。如果此类计算产生垃圾结果或异常,则浮点将无法达到其目的。