转换为int和浮点错误?

Mar*_*n K 8 c floating-point integer casting

myInt = int( 5 * myRandom() )
Run Code Online (Sandbox Code Playgroud)

myRandom()是一个随机生成的浮点数,为0.2.

所以这个陈述应该评估为1.

我的问题:是否有可能由于浮点错误而无法评估为1

例如,如果由于浮点错误的东西应该是0.2会是LESS比?IE,例如考虑以下3种可能性:

int(5 * 0.2 )                = 1 //case 1 normal
int(5 * 0.2000000000000001 ) = 1 //case 2 slightly larger, its OK
int(5 * 0.1999999999999999 ) = 0 //case 3 negative, is NOT OK, as int() floors it
Run Code Online (Sandbox Code Playgroud)

CASE3甚至有可能?与0.1999999999999999是一个浮点错误的结果?到目前为止,我从未真正看到过负的epsilon,只有情况2,当它稍微大一点时,那就好了,就像它被转换为int()时那样'将'置于正确的结果.然而,对于负epsilon,'floor'效果将使得结果0.9999999999999996评估为0.

Eri*_*hil 3

myRandom 不可能返回 .2,因为 .2 不能表示为浮点数或双精度数,假设您的目标系统使用 IEEE 754 二进制浮点标准(这绝对是默认值)。

如果 myRandom() 返回最接近 .2 的可表示数字,则 myInt 将为 1,因为可表示为浮点数的最接近 .2 的数字略大于 .2(即 0.20000000298023223876953125),最接近的可表示双精度数也是如此(0.2000000000000000111022302462515654 0423631668090820312) 。

在其他情况下,情况并非如此。例如,最接近 0.6 的双精度数是 0.59999999999999997779553950749686919152736663818359375,因此 myInt 将是 2,而不是 3。