对于浮点类型(float/double/long double)的任意值“v”,C89是否保证floor(v)和ceil(v)的数学精确整数结果是“v”类型的可表示值?
任何后来的C或C++标准是否保证了这一点?
IEEE 754是否保证了这一点?
对于浮点类型(float/double/long double)的任意值“v”,C89是否保证floor(v)和ceil(v)的数学精确整数结果是“v”类型的可表示值?
任何后来的C或C++标准是否保证了这一点?
IEEE 754是否保证了这一点?
±1.xxx...xxx * 2^n
,其中有效数字字段(xxx...xxx
部分)的宽度由数字类型定义(单精度为23个二进制数字,双精度为52个二进制数字)。在允许范围内的所有指数n
的这样的数字都是可表示的。v
是正数(如果v
是负数,我们可以在下面的分析中交换ceil
和floor
)。v
有k
个有效位,并将v
写为二进制定点数;有三种可能情况:v
时,它看起来像这样:xxxxxxxxxxxxxxxxxxxxxxxx000000...00000.0
情况1:所有有效数字位都是整数。此时v
为整数,因此ceil(v) = floor(v) = v
,因此两者均容易表示。
情况2:所有有效数字位都是小数。当我们写出v
时,它看起来像:
0.000000...00000xxxxxxxxxxxxxxxxxxxxxxxx
如果v
的值在[0,1)范围内,那么floor(v)=0
是可以表示的,而ceil(v)
要么是零,要么是一,这两个值都可以表示。
情况3:v
同时包含整数和小数位:
xxxxxxxxxxxxxx.xxxxxxxxxx
floor(v)
就是:xxxxxxxxxxxxxx.
floor(v)
最多具有 k-1
个有效位,并且与 v
具有相同的指数,因此它是可表示的。v
是整数,则 ceil(v) = floor(v) = v
,因此 ceil(v)
是可表示的。否则,ceil(v) = floor(v) + 1
,因此最多具有 k-1
个有效位,并且也是可表示的。