我试图以给定的精度打印数字的平方根。
int N;
int precision;
cin>>N>>precision;
printf("%.*lf",precision,std::sqrt(N));
Run Code Online (Sandbox Code Playgroud)
这是 clang++ 打印出来的:
%./a.out
2 100
1.4142135623730951454746218587388284504413604736328125000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
它能够打印超过 50 位的精度?我以为双打只能处理 17 位数字?
我在苹果硅 m1 上运行 clang++
在这组 64 位浮点值中,sqrt(2)最接近与分数完全对应的浮点值6369051672525773/4503599627370496。正是这个有理数或1.4142135623730951454746218587388284504413604736328125十进制数,printf()按照您告诉它的精度进行打印。
17 位限制是指区分任意两个浮点数所需的有效十进制数字的数量。换句话说,如果您打印一个精度为 17 位有效数字的浮点数,然后读回它,您可以保证得到与开始时相同的浮点数(到最后一位)。
另一个方向的转换,从十进制数开始,将其转换为浮点数(即使用 53 位分子和 2 的幂分母将其近似为最接近的分数),然后将其显示为十进制,只保证保留 15 位十进制数字。例如,十进制数0.1234567890123456789将近似为8895999183877727/72057594037927936,即0.12345678901234567736988623209981597028672695159912109375。在这种情况下,1打印的浮点值的前 17 位(从 开始计数)对应于原始数字。