double literal verlustfrei im Quellcode schreiben



  • Hi, kurz was ich vorhabe:
    Ich habe eine Datei mit einem "Pseudocode", den ich mit meinem C++ Programm in eine C++ Quellcode Datei umschreiben möchte (yeah! Meta-Programmierung). Dabei möchte ich den generierten C++ Quellcode gerne direkt optimieren. Zu meinem Problem: Im Pseudocode gibt es zB. solche Rechnungen:

    scalar Variable = some complicated expression...
    

    In meinem C++ Programm mache ich die gleiche Berechnung und möchte nun den Wert der Variable in den zu generierenden C++ Quellcode als Literal schreiben:

    double Variable = some complicated expression... // Werte die Rechnung aus
    
    outputFile << "double Variable = " << std::setprecision(20) << Variable << ";\n"; // Erzeuge den C++ Quellcode mit dem Ergebnis der Rechnung als Literal. Aber wie viele Stellen machen Sinn?
    

    Das Problem dabei ist, dass ich nicht weiß, was der beste Weg ist, um den Wert der Variable als Literal darzustellen. Im Moment arbeite ich mit std::setprecision. Allerdings ist das Vorgehen natürlich nur begrenzt sinnvoll, da in der Dezimaldarstellung immer etwas verloren geht. Soweit ich weiß kann man einer double Variable nicht direkt den Hex-Wert zuweisen (macht ja auch Sinn, die interne Darstellung von Mantisse/Exponent ist ja nicht festgelegt). Wie würdet ihr also vorgehen, wenn ihr in so einem Fall möglichst wenig "Genauigkeit" bei der Übertragung von echtem Wert zum Literal verlieren möchtet?


  • Mod

    Konverter schrieb:

    Allerdings ist das Vorgehen natürlich nur begrenzt sinnvoll, da in der Dezimaldarstellung immer etwas verloren geht.

    Das ist nicht wahr. Die Dezimaldarstellung kann sämtliche Werte der dem double unterliegenden Binärdarstellung exakt darstellen (aber nicht umgekehrt!). Aber das ist nicht einmal nötig, da bei einer gegebenen Dezimaldarstellung zum nächsten darstellbaren Binärwert gerundet wird. Daher gibt es eine fixe Stellenzahl, bei der man einem dezimalen Literal eindeutig einen double-Wert zuweisen kann, obwohl man gar nicht den exakten Wert vorliegen hat. Diese Zahl ist in cfloat definiert als das Makro DBL_DIG und wird in der Regel so etwas wie 15 sein



  • So habe ich es noch garnicht betrachtet. Wenn ich also mindestens DBL_DIG signifikante Stellen als Literal speichere, dann sollte der Wert der Variable durch die Rundung zurück in die Binärdarstellung die Gleiche sein, wie vorher?


  • Mod

    Konverter schrieb:

    So habe ich es noch garnicht betrachtet. Wenn ich also mindestens DBL_DIG signifikante Stellen als Literal speichere, dann sollte der Wert der Variable durch die Rundung zurück in die Binärdarstellung die Gleiche sein, wie vorher?

    So ist es.



  • Super! Dann hat sich mein Problem ja schon gelöst. Danke!


Log in to reply