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

Kri*_*ege 6 c floating-point ieee-754 floor ceil

对于浮点型的任意的值"V"(浮动/双/长双),确实C89保证地板的数学上精确的整数结果(v)和小区(v)为"V的类型的表示值"?

以后的C或C++标准是否有保证?

IEEE 754能保证这一点吗?

Ste*_*non 8

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


回想一下,正常的IEEE-754数字具有这样的形式±1.xxx...xxx * 2^n,其中有效数字字段(xxx...xxx部分)的宽度由数字的类型定义(单精度为23位二进制数,双精度为52位二进制数).指数(n)在允许范围内的所有此类数字都是可表示的.

假设WLOG v是正数(如果v是负数,我们可以交换ceilfloor在以下分析中).

vk显著位,并写v了作为一个二进制定点数; 有三种可能性:

情况1:所有有效位都是整数.当我们写出来时v,它看起来像这样

xxxxxxxxxxxxxxxxxxxxxxxx000000...00000.0
Run Code Online (Sandbox Code Playgroud)

那么v是一个整数,所以ceil(v) = floor(v) = v,两者都是平凡的代表.

情况2:所有有效位都是小数.当我们写出来时v,它看起来像

0.000000...00000xxxxxxxxxxxxxxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

那么v它在[0,1]范围内,因此floor(v) = 0,它是可表示的,并且ceil(v)是0或1,两者都是可表示的.

情况3:v包含整数和小数有效位:

xxxxxxxxxxxxxx.xxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

floor(v)就是:

xxxxxxxxxxxxxx.
Run Code Online (Sandbox Code Playgroud)

因为我们抛弃了至少一个小数位,floor(v)具有最多k-1有效位,并且具有相同的指数v,因此它是可表示的.

如果v是整数,那么ceil(v) = floor(v) = v,ceil(v)可以表示.否则,ceil(v) = floor(v) + 1因此也具有最多k-1有效位并且也是可表示的.

  • @EricPostpischil:是的,C标准允许这样的类型.也就是说,没有一种常见的替代浮点格式(甚至是旧的IBM或UNIVAC等轻度异常格式)也没有一个属性,即所有足够大的数字都是整数. (2认同)