为什么在使用 printf float 和 double 时显示相同的位数?

发布于 2025-01-11 09:38:24 字数 484 浏览 1 评论 0原文

我想看看使用 float 和使用 double 时得到的数字有多少差异,但我得到相同的结果

#include <stdio.h>

int main()
{
    float x=1.2222222222222222f;
    printf("%f %d", x,sizeof(x)); // This is what it prints out 1.222222 4
    return 0;
}
#include <stdio.h>

int main()
{
    double x=1.2222222222222222;  
    printf("%f %d", x,sizeof(x));  // This is what it prints out 1.222222 8
    return 0;
}

它打印出相同的值,即使 double 显然是大小的两倍并且应该保存更多数字。我做错了什么?

I wanted to see the difference in how many digits i get when using float and when using double but i get the same results

#include <stdio.h>

int main()
{
    float x=1.2222222222222222f;
    printf("%f %d", x,sizeof(x)); // This is what it prints out 1.222222 4
    return 0;
}
#include <stdio.h>

int main()
{
    double x=1.2222222222222222;  
    printf("%f %d", x,sizeof(x));  // This is what it prints out 1.222222 8
    return 0;
}

It prints out the same value even tho double is obviously double the size and should save more digits. What am i doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烙印 2025-01-18 09:38:24

sizeof 返回size_t。要打印 size_t,您需要 %zu 而不是 %d

如果您想了解 floatdouble 您需要使用 %.NUMBERf 打印更多数字,

例如:

#include <stdio.h>

int main(void)
{
    float x=1.2222222222222222f;
    printf("%.70f %zu\n", x,sizeof(x)); 
    double y=1.2222222222222222;  
    printf("%.70f %zu\n", y,sizeof(y)); 
    return 0;
}

输出:

1.2222222089767456054687500000000000000000000000000000000000000000000000 4
1.2222222222222220988641083749826066195964813232421875000000000000000000 8

sizeof returns size_t. To print size_t you need %zu instead of %d

If you want to see the real difference between float and double you need to print more digits using %.NUMBERf

Like:

#include <stdio.h>

int main(void)
{
    float x=1.2222222222222222f;
    printf("%.70f %zu\n", x,sizeof(x)); 
    double y=1.2222222222222222;  
    printf("%.70f %zu\n", y,sizeof(y)); 
    return 0;
}

Output:

1.2222222089767456054687500000000000000000000000000000000000000000000000 4
1.2222222222222220988641083749826066195964813232421875000000000000000000 8
万劫不复 2025-01-18 09:38:24

即使 double 明显是大小的两倍,它也会打印出相同的值,并且应该保存更多的数字。

当在 printf() 中将 float 作为 ... 参数传递时,它首先被提升为 double"%f"double 打印到 . 之后四舍五入的 6 位。

由于四舍五入到小数点后 6 位后原始值没有差异,因此它们看起来相同。

我做错了什么?

期望默认精度 6 不足以区分。


使用"%a"最容易看出不同。

printf("%a\n", 1.2222222222222222);
printf("%a\n", 1.2222222222222222f);

0x1.38e38e38e38e3p+0
0x1.38e38ep+0

或以指数表示法具有足够的小数位。

printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222);
printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222f);

1.2222222222222221e+00
1.2222222089767456e+00

It prints out the same value even tho double is obviously double the size and should save more digits.

When passing a float as a ... argument in printf(), it is first promoted to a double. "%f" prints that double to a rounded 6 places after the ..

Since the original values do not differ when rounded to 6 places after the decimal point, they appear the same.

What am i doing wrong?

Expecting the default precision of 6 is insufficient to distinguish.


Easiest to see different with "%a".

printf("%a\n", 1.2222222222222222);
printf("%a\n", 1.2222222222222222f);

0x1.38e38e38e38e3p+0
0x1.38e38ep+0

or with sufficient decimal places in exponential notation.

printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222);
printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222f);

1.2222222222222221e+00
1.2222222089767456e+00
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文