为什么在 C 中双精度打印与 float 具有不同大小时相同的值?

问题描述 投票:0回答:2

我需要使用 π 进行计算。当我检查M_PI的精度时,它只打印了7个十进制数字。所以我

#defined
我自己的
MY_PI
。但我仍然面临着同样的问题。
double
应支持 15-17 位十进制数字。为什么我只得到6

#define MY_PI 3.1415926535897932384626433832795028841971
#include<stdio.h>
#include<math.h>
int main()
{
    printf("%f\n%lf\n%20lf\n",M_PI,M_PI,M_PI);
    printf("%d\n%d\n",sizeof(float),sizeof(double));
    printf("%f\n%lf\n%20lf\n",MY_PI,MY_PI,MY_PI);
    return 0;
}

执行代码会产生这样的结果,

3.141593
3.141593
            3.141593
4
8
3.141593
3.141593
            3.141593

Process returned 0 (0x0)   execution time : 0.080 s
Press any key to continue.


c floating-point double
2个回答
2
投票

C 不会将有关参数的类型信息传递给函数。

printf
从您传递的格式字符串中获取所有类型信息。

由于历史原因,

%f
%lf
都告诉
printf
期待
double
争论。根据 C 2018 7.21.6.1 8,
%f
指示
printf
:

表示浮点数的

double
参数将转换为格式为 [-]ddd.ddd 的十进制表示法,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;…

因此,打印六位数字仅仅是因为这是默认值,而不是因为与类型有任何特别关系。要查看更多数字,请请求更多数字:

printf("%.60f\n", M_PI);

这通常会打印:

3.141592653589793115997963468544185161590576171875000000000000

0
投票

那是因为你给出的 printf 的精度。当使用 %f 或 %lf 时,printf 函数始终只打印小数点后 6 位数字。你必须告诉它你想要的小数点后有多少位。看起来你尝试过这个,但方法不对。您必须在要查看的位数之前添加一个点。

示例:

printf("Test: %.20lf", MY_PI);
© www.soinside.com 2019 - 2024. All rights reserved.