Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C IEEE 754四舍五入或斩波_C_Floating Point_Ieee 754 - Fatal编程技术网

C IEEE 754四舍五入或斩波

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节 有效位部分被解释为(十进制或十六进制)

谁以及在什么阶段决定使用切分或舍入数字?例如,如果我编写一个C程序,其中有一个
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)中定义