1.0 / 3.0 为何不是 C++ 中的未定义操作?(不能以浮点形式表示)

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 浮点类型)。

这是否意味着上面的语句是一个未定义的操作?当然不可能——但我不明白为什么不是?

Kaz*_*Kaz 6

这里的“范围”一词是指介于最低和最高可表示值之间。它不是“域”和“范围”中的数学术语。

由于实数值太大(远离零)或太小(非零值太接近零),因此可能超出浮点类型的范围。

浮点类型不精确;这是他们的本性。某些计算产生的值是精确实际值的近似值。如果此类计算产生垃圾结果或异常,则浮点将无法达到其目的。

  • 所有有限浮点值都是_精确_。这些运算不会产生精确的数学结果。 (2认同)