Mandelbrot-Fraktale werden inzwischen ja auch mit Tiefen zu 10^500 und mehr gezeigt. Gibt es mathematische Modelle, wie man Zahlen mit derartiger Genauigkeit in den Computerprogrammen darstellt?
Man kann jede Zahl mit beliebiger Genauigkeit abspeichern, so lange der Speicher ausreicht. Wo soll denn da das Problem sein?
Ja, das ist schon klar, ein Integer-Array. Man braucht aber auch die Grundrechenarten. Und wie macht man das mit der GPU, die ausschließlich mit Float-Werten arbeitet?
Nö. Man kann entweder in jeder Speicherzelle eine Stelle der großen Zahl speichern (das nennt man dann Verschwendung) oder die einzelnen Bits jeder Zelle als Bits eines eigenen binären Zahlenformats nutzen. Ein Array sehe ich da nirgends.
Und wo soll da das Problem versteckt sein, wenn man zwei Speicherzellen addiert und den Überlauf bei der nächsten Addition berücksichtigt?
Eine GPU rechnet mitnichten mit Floats, sondern KANN mit Floats rechnen.
Ich sehe aber noch nicht, warum man sie überhaupt zwingend einsetzen muss. Man kann, wenn es Sinn ergibt, aber man muss ja nicht.
Danke für die Tipps. Es würden halt Programme, die jetzt 3 Monate Rechenzeit brauchen, mit deinen Tipps versehen, dann 3000 Jahre laufen. Aber trotzdem, eins würd mich noch interessieren: wie kann ich in einer Nvidia-GPU eine Integer-Variable deklarieren?
Ich sage mal so: Die CPU kann mit 64Bit-Zahlen umgehen, und sie in Hardware schnell addieren. Der C-Compiler weiß das, und nutzt den entsprechenden Befehl, wenn zwei solche Zahlen addiert werden sollen. Will man 128 Bit, muss man das selbst basteln, denn der Compiler kennt so einen Datentypen nicht. Auch die Implementierung der Rechenoperationen muß man dann selbst machen, denn die CPU hat auch keinen 128Bit-Addierer an Bord.
Es bietet sich aber an, die 128Bit-Zahl aus zwei 64Bit-Zahlen zusammenzusetzen. Beim addieren addiert man die oberen und unteren 64Bit-Zahlen jeweils für sich, und addiert dann noch das Carry-Bit der Addition der unteren 64Bit-Zahl zum Ergebnis der Addition der oberen 64Bit-Zahlen. Da stecken natürlich ein paar Rechenoperationen drin, aber die Nutzung der 64Bit-Zahlen macht es doch sehr erträglich.
Die hier genannten 10^500 benötigen 1660Bit, man kann dazu ein Array von 64Bit-Zahlen mit Länge 25 nehmen.
(Und eigentlich nimmt man dafür irgendwelche vorgefertigten Libraries. )