c - 用C打印pi值

标签 c math floating-point double precision

我尝试打印出库 math.h 中定义的 pi 值,该库在我的系统上是

# 定义 M_PI 3.14159265358979323846/* pi */

用这个简单的代码:

#include <stdio.h>
#include <math.h>

int main() {

    long double a = M_PI;

    printf("%.20Lf\n", a);

    return 0;
}

我得到的输出是

3.14159265358979311600

为什么它与 math.h 库中定义的不同?

有没有办法重现库中定义的内容?

我的手册说类型 long double 将精度扩展到 24 位。应该不足以代表这个数字吗?

最佳答案

可以通过调用 acosl(-1); 以标准方式查询实现提供的数学常数 π (pi) 的最佳精度:

const long double pi = acosl(-1.0L);
printf("%.20Lf\n", pi);

由于此方法具有执行计算的额外开销(而您的方法使用编译时常量),因此建议将结果放入常量变量中并将其用于整个程序,仅执行一次计算。优点是它是可移植的。这将以目标平台上可用的最佳精度计算 π,并且在切换平台时需要零代码更改。

标准禁止一致的实现定义常量M_PI,因为实现定义的保留名称必须以_开头,后跟大写字母或另一个 _。如果你想使用它,你必须自己定义它。

关于c - 用C打印pi值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61932813/

相关文章:

php - 在 PHP 中读取二进制文件

c++ - Lua 5.2 : undefined symbols when using luaL_dofile()

c++ - C++ 中的二分法

c++ - 三次贝塞尔曲线 : What to do when leading coefficient is zero?

c++ - 如何读取包含 Unicode 内容的文件

c - 后台程序中的 printf()

algorithm - 难以理解描述马尔可夫鉴别算法的公式

ruby - Ruby 中 float 的用途

c - 编译器如何显示 float 的*不准确*值?

使用舍入到偶数将整数转换为半精度浮点格式