C++ dezimale Datentypen

Lesezeit: 5 Minuten

Gibt es eine Möglichkeit, dezimale Datentypen wie z decimal32, decimal64 oder decimal128in meinen C++-Programmen?

  • C++ hat keine eingebauten Dezimaltypen. Sie benötigen eine Bibliothek eines Drittanbieters.

    – Cory Nelson

    31. Dezember 2012 um 0:11 Uhr

  • Ja, das weiß ich, kennst du eine Bibliothek, die das kann?

    – fpiro07

    31. Dezember 2012 um 0:12 Uhr

  • Wir verwenden derzeit diese Implementierung, die gut funktioniert sourceforge.net/projects/stddecimal

    – Zeichnete

    7. Juni 2013 um 23:15 Uhr


  • Es gibt auch die Bloomberg bde Bibliothek, die hat bdldfp_decimal.h und bdldfp_decimalutil.h.

    – Unsinn

    25. September 2019 um 11:23 Uhr

Benutzer-Avatar
Dietmar Kühl

Die Klassen aus der Dezimal TR sind nicht für alle Compiler implementiert. Einige Compiler, z. gccimplementieren die C Dezimal TR und stellen die entsprechenden Erweiterungen auch in C++ zur Verfügung. In der Vergangenheit war eine Open-Source-Implementierung für C++ Decimal TR verfügbar, aber ich konnte sie nicht finden. Wenn Ihr Compiler die Dezimaltypen nicht unterstützt, ist es wahrscheinlich die beste Option, einen Wrapper für IBMs zu erstellen decNumber-Bibliothek.

Um die Situation in der Zukunft von C++ zu verbessern, habe ich eine erstellt planen, die TR zu aktualisieren und ich werde das aktuelle TR in einen vollständigen Vorschlag umwandeln, der für das nächste C++-Komiteetreffen (im April in Bristol) bereit ist, und versuchen, es in den C++-Standard zu übernehmen, möglicherweise in die für 2014 geplante Überarbeitung. Die Implementierung habe ich ist Teil meiner regulären Arbeit und es liegt nicht an mir zu entscheiden, ob es öffentlich zugänglich gemacht werden kann, obwohl es eine gewisse Hoffnung gibt, dass es irgendwann Open Source sein wird.

  • Ich bin ein ziemlicher Neuling, also verurteilen Sie mich nicht, wenn ich es nicht gut verstehe … Ich habe gesehen, dass gcc diese Bibliothek hat, um das Decimal TR zu implementieren: gcc.gnu.org/libstdc++ Wissen Sie, wie ich es in meinen Programmen verwenden kann?

    – fpiro07

    31. Dezember 2012 um 14:10 Uhr

  • @fpiro07, wenn Sie den G++-Compiler verwenden, sind libstdc++ (und die darin enthaltene Implementierung der Dezimalerweiterungen) automatisch verfügbar.

    – Jonathan Wakely

    31. Dezember 2012 um 18:46 Uhr


  • Die von gcc verwendeten Dezimalstellen sind nicht in der Bücherei! Es gibt sicherlich keine Dezimalklassen in libstdc++. Die Logik ist in den Compiler eingebaut. Wenn Sie gcc verwenden, können Sie es beim Erstellen von gcc so konfigurieren, dass es Dezimalunterstützung enthält (standardmäßig ist es nicht enthalten). Wenn Sie clang oder gcc ohne aktivierte Dezimalunterstützung verwenden, erhalten Sie keine Dezimalunterstützung von gcc oder seiner libstdc++.

    – Dietmar Kühl

    31. Dezember 2012 um 19:23 Uhr

  • Herr Dietmar, können Sie jetzt nach dem April-Meeting ein Update geben?

    – jwatt

    6. Mai 2013 um 13:50 Uhr

  • @jwatt: Aus verschiedenen Gründen habe ich es nicht geschafft, ein Papier für das Bristol-Meeting fertig zu stellen (abgesehen von der Zeit auch, dass C wieder an dem Thema gearbeitet hat und es sowieso nicht in C++ 2014 schaffen würde) . Der aktualisierte Plan besteht darin, die TR zu aktualisieren und C++ 2017 als Ziel zu haben …

    – Dietmar Kühl

    6. Mai 2013 um 21:23 Uhr

Benutzer-Avatar
Piotr

Sie können eine einfach zu verwendende Nur-Header-Lösung für C++ mit Vorlagen verwenden:
https://github.com/vpiotr/decimal_for_cpp

Beachten Sie, dass dies kein a ist *Groß*Dezimalklasse; es ist auf 64-Bit-Werte von “Mantissen”-Ziffern begrenzt.

[taken from link]

  #include "decimal.h"

  using namespace dec;

  // the following declares currency variable with 2 decimal points
  // initialized with integer value (can be also floating-point)
  decimal<2> value(143125);

  // to use non-decimal constants you need to convert them to decimal
  value = value / decimal_cast<2>(333.0);

  // output values
  cout << "Result is: " << value << endl;
  // this should display something like "429.80"

  // to mix decimals with different precision use decimal_cast
  decimal<6> exchangeRate(12.1234);
  value = decimal_cast<2>(decimal_cast<6>(value) * exchangeRate);

  cout << "Result 2 is: " << value << endl;
  // this should display something like "5210.64"

  cout << "Result 2<6> is: " << decimal_cast<6>(value) << endl;
  // this should display something like "5210.640000"

  • Mehr Konstruktor erforderlich, wie dec::decimal<2> vol = 1.002; (clang 11.0) siehe auch: stackoverflow.com/questions/21822438/…

    – vrqq

    18. Juli 2021 um 15:15 Uhr


Verwenden Sie ein int32 oder int64 und verschieben Sie (manuell) das Dezimalkomma an die gewünschte Stelle. Wenn Sie beispielsweise Dollar messen, messen Sie stattdessen einfach Cent und zeigen Sie den Wert anders an. einfach!

  • Dieser Ansatz funktioniert, wenn Sie tatsächlich eine bestimmte Waage haben, die Sie unterstützen müssen. Wenn Sie mit einer Vielzahl von Skalen (Staatsschulden am oberen Ende und Devisen oder Zinsen am anderen Ende) umgehen müssen, verwenden Sie sogar int64_t gibt Ihnen nicht genug Ziffern für eine gemeinsame Skala. Die einfache Lösung funktioniert für einfache Anwendungen, versagt aber zumindest für einige Anwendungen.

    – Dietmar Kühl

    31. Dezember 2012 um 0:54 Uhr

  • Bitte beachten Sie, dass 64-Bit-Mantisse, selbst wenn Sie Centicent verwenden, Ihnen maximal 9e15 für die größte ganze Zahl geben, die Sie speichern können. Das ist immer noch ein enorm Nummer (auch für eine Staatsverschuldung 😉

    – xryl669

    15. Juli 2019 um 13:23 Uhr

  • Dies wird Festkommaarithmetik genannt und es gibt Bibliotheken wie CNL die Ihnen dies in C++ bieten. IIRC gab es den Vorschlag P0037R5 auch für die Standardisierung, aber ich bin mir über den aktuellen Status nicht sicher. In C wird dies durch die eingeführt Eingebettete C-Erweiterungen laut Wikipedia. Keine schlechte Idee, wenn es zur Domäne passt, aber ich denke, die Frage stellt etwas anderes.

    – Unsinn

    25. September 2019 um 11:34 Uhr

Benutzer-Avatar
David Bradley

Boost hat auch cpp_dec_float. Das ist wahrscheinlich die beste Lösung, bis sie in den Standard aufgenommen wird.

https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

BEARBEITEN: Diese Bibliothek verwendet Gleitkommawerte in der Implementierung und ist daher meiner Meinung nach keine echte Dezimal-Mathematikbibliothek.

gcc/clang kommen (normalerweise) mit ihren eigenen Fließkomma-Dezimalimplementierungen, wenn Ihre Distribution beschließt, sie in die gcc/clang-Version zu kompilieren, die sie anbieten (nicht der Fall bei einigen Arm-Distributionen, die ich ausprobiert habe). Aus diesem Grund benötigen Sie manchmal eine benutzerdefinierte Implementierung des Dezimaltyps. Versuchen Bergwerk für Ideen (getestet auf i586 bis hin zu aarch64).

1013140cookie-checkC++ dezimale Datentypen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy