双精度浮点数为两个双精度之和

double-double precision floating point as sum of two doubles

提问人:rych 提问时间:3/25/2012 最后编辑:phuclvrych 更新时间:9/10/2020 访问量:3926

问:

一段时间以来,我仍然无法找到dd_real(定义为)数如何被拆分为两个双精度的。比如说,如果我用字符串初始化它,会是什么 和 ?我需要理解它,然后编写一个希望很小的 Python 函数来做到这一点。struct dd_real { double x[2];...}dd_real pi = "3.14159265358979323846264338327950";pi.x[0]pi.xi[1]

我不仅想调用 QD 库的原因是,我更愿意在 Python 中重新实现正确的拆分,以便我将我的 35 位精度常量(以字符串形式给出)发送到 CUDA 代码,其中它将被 GQD 库视为双双实数——似乎是唯一的库, 在 CUDA 中处理扩展精度计算。不幸的是,在 Python 方面,这也排除了 mpmath。double2

浮点 任意 双精度双精度算术

评论

0赞 Pascal Cuoq 3/25/2012
如果您以二进制或十六进制为例,会更容易。即使有人从字面上回答了你的问题(通过告诉你 和 的值),你也无法理解相对于原始十进制值的拆分。pi.x[0]pi.x[1]
1赞 Pascal Cuoq 3/25/2012
另请注意,这绝不是“任意精度”。它只是“比IEEE 754双精度更精确,同时利用可用的双精度硬件”。double double

答:

6赞 Pascal Cuoq 3/25/2012 #1

假设你用二进制数初始化你的:double double

1.011010101111111010101010101010000000101010110110000111011111101010010101010
  < ---                 52 binary digits         --- >< --- more digits --- >

然后一个是,另一个是double1.01101010111111101010101010101000000010101011011000011.1011111101010010101010 * 2^-53

当您将这两个数字(作为实数)相加时,总和是初始值。第一个在其 52 位尾数中包含尽可能多的位。第二个包含剩余的位,并具有适当的指数。