двойная двойная точность с плавающей запятой как сумма двух значений типа double

Следуя документам и исходному коду арифметики двойной двойной точности для некоторых время, я до сих пор не могу понять, как именно число 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, где он будет библиотека GQD — единственная библиотека, , чтобы иметь дело с вычислениями повышенной точности в CUDA. К сожалению, это также исключает использование mpmath на стороне Python.


person rych    schedule 25.03.2012    source источник
comment
Было бы проще, если бы вы взяли пример в двоичном или шестнадцатеричном формате. Даже если кто-то буквально ответит на ваш вопрос (сообщив вам значения pi.x[0] и pi.x[1]), вы не сможете понять никакого смысла разделения по отношению к исходному десятичному значению.   -  person Pascal Cuoq    schedule 25.03.2012
comment
Также обратите внимание, что double double никоим образом не является произвольной точностью. Это только более высокая точность, чем у двойной точности IEEE 754, при использовании преимуществ доступного оборудования двойной точности.   -  person Pascal Cuoq    schedule 25.03.2012


Ответы (1)


Скажем, вы инициализируете свой double double двоичным числом:

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

Тогда один double будет 1.0110101011111110101010101010100000001010101101100001, а другой будет 1.1011111101010010101010 * 2^-53

Когда вы складываете эти два числа (как действительные числа), сумма является начальным значением. Первый упаковывает как можно больше битов в свою 52-битную мантиссу. Второй содержит оставшиеся биты с соответствующим показателем степени.

person Pascal Cuoq    schedule 25.03.2012