我需要用π来计算.当我判断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不会将有关参数的类型信息传递给函数.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

请注意,%20f请求20个字符的field width.字段宽度通常用于间距,以帮助在多行上对齐数据列.为了满足字段宽度,空格用于填充.上面的代码使用%.60f请求precision,它控制产生的数字的数量.

C++相关问答推荐

如何避免使用相对路径包含在c中

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

C指针地址和转换

标准的C17标准是用括号将参数包装在函数声明中吗

将整数的.csv文件解析为C语言中的二维数组

创建一个fork导致fget无限地重新读取文件

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

从uint8_t*转换为char*可接受

使用TCL C API导航到列表中的元素

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

如何在VSCode中创建和使用我自己的C库?

用C++构建和使用DLL的困惑

从不兼容的指针类型返回&&警告,但我看不出原因

计算时出现奇怪的计算错误;N Select K;在C中

如何使crc32的结果与cksum匹配?

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

如何用用户输入的多个字符串填充数组?

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

如何在 C 中的 Postgres 函数的表中 for 循环