Kri*_*ege 6 c floating-point ieee-754 floor ceil
对于浮点型的任意的值"V"(浮动/双/长双),确实C89保证地板的数学上精确的整数结果(v)和小区(v)为"V的类型的表示值"?
以后的C或C++标准是否有保证?
IEEE 754能保证这一点吗?
这可以通过构建IEEE-754号码来保证.(要明确:C不保证IEEE-754,但以下分析适用于我熟悉的所有其他浮点格式;关键属性是格式中所有足够大的数字都是整数).
回想一下,正常的IEEE-754数字具有这样的形式±1.xxx...xxx * 2^n,其中有效数字字段(xxx...xxx部分)的宽度由数字的类型定义(单精度为23位二进制数,双精度为52位二进制数).指数(n)在允许范围内的所有此类数字都是可表示的.
假设WLOG v是正数(如果v是负数,我们可以交换ceil并floor在以下分析中).
让v有k显著位,并写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有效位并且也是可表示的.