gpt4 book ai didi

c - M_PI 不精确

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:16 26 4
gpt4 key购买 nike

我正在尝试 printf M_PI,但我认为我没有使用正确的格式说明符。输出应为:3.14159265358979323846 但我得到 3.14159265358979300000。

int main(void)
{
printf("%.20f\n", M_PI);
return 0;
}

我试过使用 %Lf、%Lg、%e、%g 但它们都不起作用,所以我不确定这个错误是来自格式说明符还是与我的硬件有关'我正在使用。

最佳答案

假设您的编译器将 double 浮点类型映射到 IEEE 754 double ,则 double 具有 53 位二进制精度。 float 以 2 为基数表示的事实意味着它不是可以表示为 double 并且具有短十进制表示的同一组数字。特别是,最接近 π 的 double 的精确值具有仅 53 位二进制精度的紧凑表示,但以十进制表示为 3.141592653589793115997963468544185161590576171875。这不是 π 到 50 位十进制数字的近似值!它是 π 的近似值,精度为 53 位二进制数,这意味着大约前 17 位十进制数是正确的,而其他数位只是因为与 M_PI 中的基数 2 不匹配而存在以 10 为基数,我们现在正在讨论它的值(value)。

这意味着您可以期望质量 printf 实现打印3.14159265358979311600。请注意,这并不完全是您在问题中所说的预期字符串,而是 .M_PI 实际值的四舍五入十进制表示形式到 20 位数字。无论如何,您可以期待一个quality printf 实现来打印显示double 精确值所需的所有十进制数字,尽管在最坏的情况there can be 750 or so .

C 标准 does not force所有 printf 实现都具有此属性:

For e, E, f, F, g, and G conversions, if the number of significant decimal digits is at most DECIMAL_DIG, then the result should be correctly rounded. If the number of significant decimal digits is more than DECIMAL_DIG but the source value is exactly representable with DECIMAL_DIG digits, then the result should be an exact representation with trailing zeros. Otherwise, the source value is bounded by two adjacent decimal strings L < U, both having DECIMAL_DIG significant digits; the value of the resultant decimal string D should satisfy L <= D <= U, with the extra stipulation that the error should have a correct sign for the current rounding direction.

更容易实现最多打印 double 的精确值的前 17 位十进制数字,然后清零,并且 C 标准允许这样的实现。这可能是您的编译器发生的情况。(采用这种捷径的编译器通常也不会实现“当前舍入方向”约束。)

关于c - M_PI 不精确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51344013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com