6

Ich schreibe ein Stück Code, in dem ich von Double in Float-Werte konvertieren muss. Ich benutze boost :: numeric_cast, um diese Konvertierung durchzuführen, die mich auf jeden Überlauf/Unterlauf aufmerksam macht. Ich bin jedoch auch daran interessiert zu wissen, ob diese Umwandlung zu einem gewissen Präzisionsverlust führte oder nicht.Erkennung von Präzisionsverlust bei der Konvertierung von Double in Float

Zum Beispiel

double source = 1988.1012; 
    float dest = numeric_cast<float>(source); 

dest erzeugt, den Wert 1988,1

Gibt es eine Möglichkeit zur Verfügung, in denen ich diese Art von Präzisionsverlust erkennen kann/Rundung

+7

In diesem Fall wird * immer * "Präzisionsverlust" sein. –

Antwort

11

Sie den Schwimmer werfen konnte zurück zu verdoppeln und dieses Doppelte mit dem Original zu vergleichen - das sollte Ihnen einen angemessenen Hinweis darauf geben, ob es einen Genauigkeitsverlust gab.

+4

Besser als fair. Es wird Ihnen genau sagen, wenn Informationen verloren gegangen sind. –

9
float dest = numeric_cast<float>(source); 
double residual = source - numeric_cast<double>(dest); 

Daher residual enthält den „Verlust“ Sie suchen.

1

Schauen Sie sich diese Artikel für single precision und double precision Schwimmer an. Zunächst einmal haben Floats 8 Bits für den Exponenten gegenüber 11 für ein Doppel. Alles, was größer als 10^127 oder kleiner als 10^-126 ist, wird der Überlauf sein, wie du erwähnt hast. Für den Gleitkommawert haben Sie 23 Bits für die tatsächlichen Ziffern der Zahl, gegenüber 52 Bits für das Doppel. Offensichtlich haben Sie viel mehr Stellen für die Genauigkeit als für das Doppelte.

Angenommen, Sie haben eine Nummer wie: 1.1123. Diese Zahl wird möglicherweise nicht tatsächlich als 1.1123 codiert, da die Ziffern in einer Gleitkommazahl tatsächlich als Brüche addiert werden. Zum Beispiel, wenn Ihre Bits in der Mantisse 11001 wären, dann würde der Wert von 1 (implizit) + 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * gebildet werden 1/32 + 0 * (64 + 128 + ...). Der genaue Wert kann also nicht codiert werden, es sei denn, Sie können diese Brüche so addieren, dass die genaue Zahl angegeben wird. Das ist selten. Daher wird es fast immer einen Präzisionsverlust geben.

+1

Darf ich vorschlagen, stattdessen auf die oft erwähnte http://docs.sun.com/source/806-3568/ncg_goldberg.html zu verweisen? (Ich habe nicht genug Rep, um es selbst zu tun) –

1

Sie werden einen gewissen Präzisionsverlust haben, wie Dave's Antwort sagt. Wenn Sie sich jedoch darauf konzentrieren wollen, es zu quantifizieren und eine Ausnahme auszulösen, wenn es eine bestimmte Zahl überschreitet, müssen Sie die Gleitkommazahl selbst öffnen und den Mantissenexponenten aussortieren und dann eine Analyse durchführen, um festzustellen, ob Sie Ihre Toleranz überschritten.

Aber die gute Nachricht, seine normalerweise der Standard-IEEE Fließkomma-Float. :-)