printf 如何打印小数点后的 53 位数字?

How is printf printing 53 digits after decimal point?

我试图以给定的精度打印数字的平方根。

int N;
int precision;
cin>>N>>precision;
printf("%.*lf",precision,std::sqrt(N));

这就是 clang++ 打印出来的内容:

%./a.out
2 100
1.4142135623730951454746218587388284504413604736328125000000000000000000000000000000000000000000000000

能打印出50位以上的精度? 我以为双打只能处理17位数字?

我是 运行 clang++ on apple silicon m1

It was able to print over 50 digits of precision? I thought doubles could only handle 17 digits?

这是错误的精度,因为你要求它。

假设我问某人建筑物有多高,他们说“哦,大约 50 米”。如果你要我以英尺为单位给你,精确到小数点后五位,我可以——164.04199 英尺。但是精度是假的。

查看:
输出:1.414213562373095145474621858738828450441...
正确:1.414213562373095048801688724209698078569...

在一组64位浮点值中,sqrt(2)最接近正好对应小数[=11=的浮点值].正是这个有理数,或十进制的 1.4142135623730951454746218587388284504413604736328125printf() 以您告诉它的精度打印。

17位限制是指区分任意两个浮点数所需的有效小数位数。换句话说,如果你打印一个精度为 17 位有效数字的浮点数,然后读回它,你保证得到与你开始时相同的浮点数(到最后一位)。

另一个方向的转换,从十进制数开始,将其转换为浮点数(即用 53 位分子和二次方分母将其近似为最接近的分数),然后显示为小数,只保证保留15位小数。例如,十进制数0.1234567890123456789将近似为8895999183877727/72057594037927936,即0.12345678901234567736988623209981597028672695159912109375。在这种情况下,打印的浮点值的前 17 位(从 1 开始计算)对应于原始数字。