2010-11-28 11 views
0

Angenommen, ich bin in einer Umgebung, deren einziger Gleitkommatyp (sagen wir) 32 Bit breit ist, und ich möchte einige Berechnungen mit 64-Bit-Gleitkommazahlen durchführen.Doubles mit Floats implementieren?

Gibt es eine vernünftige/effiziente/machbare Möglichkeit, den Datentyp float32 zu verwenden, um einen breiteren Fließkommadatentyp wie float64 zu implementieren? (Oder sogar float63 oder float48 oder etwas, das merklich breiter ist als die 32, die ich habe?)

Oder bin ich am besten mit der Implementierung von längeren Fließkomma-Datentypen mit Ganzzahlen?

Ich vermute, die spezifischen Bedeutungen der Bit-Positionen würde dies im Grunde unmöglich machen, aber ich bin kein Experte für Zahlen, und ich weiß nicht, wie man danach suchen, also gibt es vielleicht einen cleveren Ansatz da draußen .

Antwort

3

Es gibt Tricks, die Sie anwenden können, um mehr Präzision zu erreichen, als Ihre Maschine Ihnen bieten möchte. Einer der bekanntesten ist der Kahan Summenalgorithmus für zusätzliche Präzision erhalten, wenn eine Summe aus einer Reihe von Gleitkommazahlen Berechnung:

http://en.wikipedia.org/wiki/Kahan_summation_algorithm

ein solches Verfahren Gestaltung erfordert ziemlich genaue Kenntnis der Funktionsweise von Gleitkomma rechnen, also vorsichtig vorgehen.

2

Ich denke, Ihre Vermutung ist richtig. Man könnte versuchen, ein 64-Bit-Float als das Produkt von zwei 32-Bit-Floats darzustellen, aber ich glaube nicht, dass man sowohl den Exponenten als auch die Mantisse zur gleichen Zeit arbeiten lassen könnte. Es könnte möglich sein, etwas wie ein float48 als Nettoeffekt zu bekommen, aber es scheint insgesamt ziemlich dubios.

Aber es sollte Bibliotheken geben, um es mit Ints zu tun. Es ist noch nicht so lange her, dass häufig verwendete CPUs keine Hardware-Float-Unterstützung hatten.

Verwandte Themen