对于浮点类型(float / double / long double)的任意值'v',C89是否保证floor(v)和ceil(v)的数学上精确的整数结果是该类型的可表示值'v'?
以后的C或C ++标准是否都能保证这一点?
IEEE 754能否保证这一点?
答案 0 :(得分:8)
这可以通过构建IEEE-754号码来保证。 (需要说明的是:C不保证IEEE-754,但以下分析适用于我熟悉的所有其他浮点格式;关键属性是格式中所有足够大的数字都是整数)。 / p>
回想一下,正常的IEEE-754号码的格式为±1.xxx...xxx * 2^n
,其中有效数字段的宽度(xxx...xxx
部分)由数字的类型定义(单个23位二进制数字)精度,52位二进制数字,用于双精度)。所有这些带有指数(n
)的数字都在可允许的范围内。
假设v
为肯定的WLOG(如果v
为负数,我们可以在以下分析中交换ceil
和floor
。
让v
有k
个有效位,并将v
写为二进制定点数;有三种可能性:
情况1:所有有效位都是整数。当我们写出v
时,它看起来像这样
xxxxxxxxxxxxxxxxxxxxxxxx000000...00000.0
然后v
是一个整数,因此ceil(v) = floor(v) = v
,因此两者都是可以表示的。
情况2:所有有效位都是小数。当我们写出v
时,它看起来像
0.000000...00000xxxxxxxxxxxxxxxxxxxxxxxx
然后v
在[0,1]范围内,所以floor(v) = 0
是可表示的,ceil(v)
是零或一,两者都是可表示的。< / p>
案例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
个有效位,也可以表示。