首页 > 解决方案 > printf 如何在小数点后打印 53 位?

问题描述

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

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

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

%./a.out
2 100
1.4142135623730951454746218587388284504413604736328125000000000000000000000000000000000000000000000000

它能够打印超过 50 位的精度?我以为双打只能处理 17 位数字?

我在苹果硅 m1 上运行 clang++

标签: c++precision

解决方案


在这组 64 位浮点值中,sqrt(2)最接近与分数精确对应的浮点值6369051672525773/4503599627370496。正是这个有理数或1.4142135623730951454746218587388284504413604736328125十进制数,printf()以您告诉它的精度打印。

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

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


推荐阅读