双循环变量上的相等条件:未指定还是未定义?

Alw*_*ing 1 c++ precision undefined-behavior unspecified-behavior

我想直接讲一下术语。考虑:

for (double d = 0.0; d != 1.0; d += 0.1)
    cout << d << " ";
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,由于双重运算不精确,因此此循环可以是有限的或无限的。是否认为这是未指定或未定义的行为?

Bat*_*eba 6

程序的行为是由实现定义的:不同的实现可以具有不同的行为,但是必须对其进行记录。这与未指定的行为(不需要记录)和未定义的行为(所有行为)不同。另请参见未定义,未指定和实现定义的行为

doubleIEEE754定义了的常见实现。如果您的实现遵循该标准,则该循环将始终恢复相同的输出。

在IEEE754下,您的循环是无限的-您将跳过该循环1.0,最终d将增长到0.1无添加操作的大小。

  • @AlwaysLearning另请参阅[`[defns.impl.defined]`](http://eel.is/c++draft/defns.impl.defined),[`[defns.unspecified]`](http:// eel.is/c++draft/defns.unspecified)和[`[defns.undefined]`](http://eel.is/c++draft/defns.undefined)。 (2认同)