2012-03-25 8 views
1

Nach papers and source code for double-double arithmetic seit einiger Zeit kann ich immer noch nicht herausfinden, wie genau eine dd_real (definiert als struct dd_real { double x[2];...}) Zahl in zwei verdoppelt wird. Angenommen, ich initialisiere es mit einer Zeichenfolge, dd_real pi = "3.14159265358979323846264338327950"; was wird pi.x[0] und pi.xi[1] sein? Ich muss es verstehen und dann eine hoffentlich kleine Python-Funktion schreiben, die das tut.Double-Double-Precision Fließkomma als Summe aus zwei Doppel

Der Grund, warum ich nicht nur in die QD-Bibliothek aufrufen möchte, ist, dass ich die korrekte Aufteilung in Python lieber neu implementieren möchte, damit ich meine 35-stelligen Präzisionskonstanten (als Strings angegeben) als double2 an CUDA sende Code, wo es von der GQD library als Doppel-Doppel Reals behandelt werden wird - die einzige Bibliothek, scheint es, mit erweiterten Präzisions-Cauclations in CUDA umzugehen. Das schließt mpmath leider auch auf Python-Seite aus.

+0

Es wäre einfacher, wenn Sie ein Beispiel im binären oder hexadezimalen Beispiel nehmen würden. Selbst wenn jemand Ihre Frage buchstäblich beantwortet (indem er Ihnen die Werte von 'pi.x [0]' und 'pi.x [1]' sagt), werden Sie keinen Sinn für die Aufteilung in Bezug auf die ursprünglicher Dezimalwert –

+0

Beachten Sie auch, dass "double double" in keiner Weise "willkürliche Präzision" ist. Es ist nur "mehr Präzision, dass IEEE 754 doppelte Präzision, unter Ausnutzung der verfügbaren Double Precision Hardware". –

Antwort

5

Sagen Sie, dass Sie Ihre double double mit der binären Zahl initialisieren:

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

Dann ein double1.0110101011111110101010101010100000001010101101100001 sein wird, und der andere wird 1.1011111101010010101010 * 2^-53

sein, wenn Sie diese beiden Zahlen (als reelle Zahlen) hinzufügen, Die Summe ist der Anfangswert. Der erste verpackt so viele Bits wie möglich in seiner 52-Bit-Mantisse. Der zweite enthält die verbleibenden Bits mit dem entsprechenden Exponenten.