Floating point 作为两个双精度之和的双精度浮点

Floating point 作为两个双精度之和的双精度浮点,floating-point,arbitrary-precision,double-double-arithmetic,Floating Point,Arbitrary Precision,Double Double Arithmetic,接下来的一段时间里,我仍然无法找到一个dd_real(定义为struct dd_real{double x[2];…})数是如何被分成两个双精度的。假设我用一个字符串初始化它,dd_real pi=“3.14159265358979323846264338327950”什么将是pi.x[0]和pi.xi[1]?我需要理解它,然后编写一个小Python函数来实现它 我不想调用QD库的原因是我更愿意在Python中重新实现正确的拆分,这样我就可以将35位精度常量(以字符串形式给出)作为double2

接下来的一段时间里,我仍然无法找到一个dd_real(定义为
struct dd_real{double x[2];…}
)数是如何被分成两个双精度的。假设我用一个字符串初始化它,
dd_real pi=“3.14159265358979323846264338327950”什么将是
pi.x[0]
pi.xi[1]
?我需要理解它,然后编写一个小Python函数来实现它


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

假设您使用二进制数初始化了
double-double

1.011010101111111010101010101010000000101010110110000111011111101010010101010
  < ---                 52 binary digits         --- >< --- more digits --- >
1.0110101111010101010101010101010000000101010110110101011000011111111101010010101010
<---52位二进制数字--><---更多数字-->
然后一个
double
将是
1.011010111101010101010101000000010101011010100001
另一个将是
1.1011111101010010101010*2^-53


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

假设您使用二进制数初始化
double-double

1.011010101111111010101010101010000000101010110110000111011111101010010101010
  < ---                 52 binary digits         --- >< --- more digits --- >
1.0110101111010101010101010101010000000101010110110101011000011111111101010010101010
<---52位二进制数字--><---更多数字-->
然后一个
double
将是
1.011010111101010101010101000000010101011010100001
另一个将是
1.1011111101010010101010*2^-53


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

如果以二进制或十六进制为例,会更容易。即使有人直接回答了您的问题(通过告诉您pi.x[0]
pi.x[1]
),您也无法理解相对于原始十进制值的分割。还要注意的是,
double-double
绝不是“任意精度”。这只是“比IEEE 754双精度更高的精度,同时利用了可用的双精度硬件”。如果您以二进制或十六进制为例,这会更容易。即使有人直接回答了您的问题(通过告诉您pi.x[0]和
pi.x[1]
),您也无法理解相对于原始十进制值的分割。还要注意的是,
double-double
绝不是“任意精度”。它只是“比IEEE 754双精度更高的精度,同时利用了可用的双精度硬件”。