IEEE 754 舍入或斩波

IEEE 754 rounding or chopping

提问人:Dante 提问时间:10/15/2014 最后编辑:Yu HaoDante 更新时间:10/16/2014 访问量:709

问:

谁和在什么阶段决定使用切碎或舍入数字?例如,如果我编写一个 C 程序,并且其中有一个变量,那么数字会发生什么(无论其浮点表示如何)?是切成还是四舍五入?我的 C 编译器是否在这两种可能性之间做出决定?IEEE 754 标准是否说明我的 C 编译器应该做什么?它是在我的 CPU 架构中实现的,还是在我的操作系统中实现的?double2.572.52.6

C 浮点 IEEE-754

评论


答:

3赞 Yu Hao 10/15/2014 #1

它是实现定义的。具体来说,虽然常用,但 C 标准并不强制支持 IEEE-754。

C11 §6.4.4.2 浮动常量第3节

有效部分被解释为(十进制或十六进制)有理数;指数部分中的数字序列被解释为十进制整数。对于十进制浮动常量,指数表示有效部分的 10 的幂。对于十六进制浮点常数,指数表示有效部分的 2 的幂。对于十进制浮点常量,以及当不是 2 的幂时的十六进制浮点常量,结果要么是最接近的可表示值,要么是紧邻最近可表示值的较大或较小的可表示值,以实现定义的方式选择。对于十六进制浮点常数,当幂为 2 时,结果将正确四舍五入。FLT_RADIXFLT_RADIX

2赞 Grzegorz Szpetkowski 10/15/2014 #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) 中(有条件地)定义。