C IEEE 754四舍五入或斩波
谁以及在什么阶段决定使用切分或舍入数字?例如,如果我编写一个C程序,其中有一个C IEEE 754四舍五入或斩波,c,floating-point,ieee-754,C,Floating Point,Ieee 754,谁以及在什么阶段决定使用切分或舍入数字?例如,如果我编写一个C程序,其中有一个double变量,那么数字2.57会发生什么变化(不管它的浮点表示)?它是切分为2.5还是四舍五入为2.6?我的C编译器是否在这两种可能性之间做出决定?IEEE 754标准是否规定了我的C编译器应该做什么?它是在我的CPU架构中实现的还是在我的操作系统中实现的?它是由实现定义的。具体来说,尽管C标准很常用,但它并不强制执行IEEE-754支持 C11§6.4.4.2浮动常数第3节 有效位部分被解释为(十进制或十六进制)
double
变量,那么数字2.57
会发生什么变化(不管它的浮点表示)?它是切分为2.5
还是四舍五入为2.6
?我的C编译器是否在这两种可能性之间做出决定?IEEE 754标准是否规定了我的C编译器应该做什么?它是在我的CPU架构中实现的还是在我的操作系统中实现的?它是由实现定义的。具体来说,尽管C标准很常用,但它并不强制执行IEEE-754支持
C11§6.4.4.2浮动常数第3节
有效位部分被解释为(十进制或十六进制)有理数;指数部分的数字序列被解释为十进制整数。对于十进制浮动常数,指数表示有效位部分的10次幂。对于十六进制浮点常量,指数表示有效位部分的2的幂。对于十进制浮动常数,以及当FLT_RADIX
不是2的幂时的十六进制浮动常数,结果要么是最近的可表示值,要么是紧邻最近的可表示值的较大或较小的可表示值,以实现定义的方式选择。对于十六进制浮点常量,当FLT_基数
为2的幂时,结果将正确四舍五入
正如@YuHao所指出的,C标准并没有强制执行一致性,但有一个预定义的宏用于检查一致性。参考N1570§6.10.8.3/p1,条件特征宏:
\uuuuu STDC\uIEC\u 559\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
整数常量1,用于表示符合附录F(IEC 60559浮点)
算术)
\uu STDC\u IEC\u 559\u COMPLEX\uuu
整数常数1,用于表示符合附录G(IEC 60559)中的规范
兼容复数(算术)
正如您所发现的,它实际上是与IEEE-754相同的标准
这些宏也(有条件地)在C99(N1256§6.10.8/p2)中定义