谁和在什么阶段决定使用斩或舍入数字?例如,如果我编写一个C程序并且其中有一个double
变量,那么数字2.57
会发生什么(无论其浮点表示如何)?是剁到2.5
还是四舍五入到2.6
?我的C编译器是否决定这两种可能性? IEEE 754标准是否说明我的C编译器应该做什么?它是在我的CPU架构中实现的,还是在我的操作系统中实现的?
答案 0 :(得分:3)
它是实现定义的。具体而言,虽然常用,但C标准并未强制执行IEEE-754支持。
C11§6.4.4.2浮动常数 section3
有效数部分被解释为(十进制或十六进制)有理数;指数部分中的数字序列被解释为十进制整数。对于十进制浮点常数,指数表示有效位部分要缩放的10的幂。对于十六进制浮点常量,指数表示有效位部分要缩放的2的幂。对于十进制浮点常量,以及当
FLT_RADIX
不是2的幂时的十六进制浮点常量,结果是最接近的可表示值,或者与最近的可表示值紧邻的较大或较小的可表示值,以实现定义的方式选择。对于十六进制浮点常量,当FLT_RADIX
是2的幂时,结果将被正确舍入。
答案 1 :(得分:2)
正如@YuHao C标准所指出的那样,标准不强制IEEE-754一致,但是有预定义的宏来检查它。参考N1570§6.10.8.3/ p1,条件特征宏:
__STDC_IEC_559__
整数常数1,用于表示符合附录F(IEC 60559浮点数)中的规范 算术)。
__STDC_IEC_559_COMPLEX__
整数常数1,用于表示符合附录G(IEC 60559中的规范) 兼容的复杂算术)
您可以发现它与IEEE-754实际上是相同的标准。
这些宏也(在条件上)在C99中定义(N1256§6.10.8/ p2)。