floor()和ceil()的可表示结果

时间:2012-09-25 22:52:02

标签: c floating-point ieee-754 floor ceil

对于浮点类型(float / double / long double)的任意值'v',C89是否保证floor(v)和ceil(v)的数学上精确的整数结果是该类型的可表示值'v'?

以后的C或C ++标准是否都能保证这一点?

IEEE 754能否保证这一点?

1 个答案:

答案 0 :(得分:8)

这可以通过构建IEEE-754号码来保证。 (需要说明的是:C不保证IEEE-754,但以下分析适用于我熟悉的所有其他浮点格式;关键属性是格式中所有足够大的数字都是整数)。 / p>


回想一下,正常的IEEE-754号码的格式为±1.xxx...xxx * 2^n,其中有效数字段的宽度(xxx...xxx部分)由数字的类型定义(单个23位二进制数字)精度,52位二进制数字,用于双精度)。所有这些带有指数(n)的数字都在可允许的范围内。

假设v为肯定的WLOG(如果v为负数,我们可以在以下分析中交换ceilfloor

vk个有效位,并将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个有效位,也可以表示。