c++ - 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++
解决方案
在这组 64 位浮点值中,sqrt(2)
最接近与分数精确对应的浮点值6369051672525773/4503599627370496
。正是这个有理数或1.4142135623730951454746218587388284504413604736328125
十进制数,printf()
以您告诉它的精度打印。
17 位限制是指区分任何两个浮点数所需的有效小数位数。换句话说,如果您打印一个精度为 17 位有效数字的浮点数,然后将其读回,则可以保证获得与开始时相同的浮点数(直到最后一位)。
另一个方向的转换,从十进制数开始,将其转换为浮点数(即用 53 位分子和二次幂分母将其近似为最接近的分数),然后将其显示为十进制,仅保证保留 15 位十进制数字。例如,十进制数0.1234567890123456789
将近似为8895999183877727/72057594037927936
,即0.12345678901234567736988623209981597028672695159912109375
。1
在这种情况下,打印的浮点值的前 17 位(从 开始计数)对应于原始数字。
推荐阅读
- sql-server - 如何自动化脚本以将数据插入 SQL Server 表
- mysql - 如何每百条记录获取一条记录 - SQLAlchemy,
- css - 通用兄弟选择器 CSS 正在测试但不在网站上
- amazon-web-services - Lambda Docker 容器的完整示例?
- python - 如何将时间字符串转换为每小时数据?
- javascript - 从网络摄像头捕获多张图像 - django + js
- mongodb - 更新 mongoDB 文档中的嵌套值
- r - dplyr 对象未找到我
- python - 将 PyCharm 与 Abaqus 集成
- html - 如何将一个项目向左对齐,另一个中心与 flexbox 对齐?