c语言,printf中%g的小数位数等于0.5,且长度大于6时,不是上位元,为什么?

问题描述 投票:0回答:1
#include<stdio.h>
int main()
{
printf ("%g\n",100000.5);
printf ("%g\n",100001.5);
printf ("%g\n",100002.5);
printf ("%g\n",100003.5);
printf ("%g\n",100004.5);
printf ("%g\n",100005.5);
return 0;
}

在海湾合作委员会:

100000
100002
100002
100004
100004
100006

在vs2019中,我认为更容易理解:

100001
100002
100003
100004
100005
100006

与编译器有关吗?

c visual-studio visual-studio-2010 gcc printf
1个回答
0
投票

当你听到叮当声时,你会得到:

100000
100002
100002
100004
100004
100006

与编译器有关吗?

是的,IEEE 754 在 gcc 手册页上定义了四种可能的舍入模式:

四舍五入到最接近的值。这是默认模式。应该使用它,除非 对其他其中之一有特定的需求。在此模式下的结果 四舍五入到最接近的可表示值。如果结果是 在两个可表示值之间,偶数可表示为 选择的。即使在这里也意味着最低位为零。这个四舍五入 模式可防止统计偏差并保证数值稳定性: 冗长计算中的舍入误差将保持小于 FLT_EPSILON 的一半。

向正无穷大舍入。所有结果均四舍五入至最小 可表示的值大于结果。

向负无穷大舍入。所有结果均四舍五入至最大 可表示值小于结果。

向零舍入。所有结果均四舍五入至最大 可表示的值,其大小小于结果的大小。 换句话说,如果结果为负数,则向上舍入;如果是 正数,向下四舍五入。

更多信息请访问:https://www.gnu.org/software/libc/manual/html_node/Rounding.html

因此 gcc 使用“舍入到最接近的值”,而 Visual Studio 2019 使用“舍入到正无穷大”

好消息是,在 gcc 中,如果您更喜欢 Visual Studio 应用的模式,您可以更改模式:

fenv.h 定义了常量,您可以使用它们来引用各种 舍入模式。当且仅当 FPU 支持相应的舍入模式。

您的情况:

#include <stdio.h>
#include <fenv.h>
                                                                                                                                             
int main(void)
{
    fesetround(FE_UPWARD);
    printf ("%g\n",100000.5);
    printf ("%g\n",100001.5);
    printf ("%g\n",100002.5);
    printf ("%g\n",100003.5);
    printf ("%g\n",100004.5);
    printf ("%g\n",100005.5);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.