it-swarm.com.de

C++ - Dezimaldatentypen

Gibt es eine Möglichkeit, dezimale Datentypen wie decimal32, decimal64 oder decimal128 in meinen C++ - Programmen zu verwenden?

32
fpiro07

Die Klassen von Decimal TR sind nicht für alle Compiler implementiert. Einige Compiler, z. B. gcc , implementieren die C Dezimalzahl TR und stellen die entsprechenden Erweiterungen auch in C++ bereit. 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 die Bibliothek IBM decNumber zu erstellen.

Um die Situation in der Zukunft von C++ zu verbessern, habe ich einen Plan zur Aktualisierung des TR erstellt und ich werde aus dem aktuellen TR einen vollständigen Vorschlag machen, der für die nächste Sitzung des C++ - Komitees bereit ist (im April in Bristol). Ich versuche, es in den C++ - Standard zu übernehmen, möglicherweise in die für 2014 geplante Revision. Die Implementierung, die ich habe, ist Teil meiner regulären Arbeit und es liegt nicht an mir zu entscheiden, ob sie öffentlich verfügbar gemacht werden kann einige hoffen, dass es irgendwann Open Source sein kann.

25
Dietmar Kühl

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

Beachten Sie, dass dies keine * Big * Decimal-Klasse ist. es ist auf "Mantissen" -Ziffern auf 64 Bits beschränkt.

[von link genommen]

  #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"
13
Piotr

verwenden Sie ein int32 oder int64 und verschieben Sie das Dezimalzeichen (manuell) dorthin, wo Sie es haben möchten. Wenn Sie beispielsweise Dollar messen, messen Sie stattdessen nur Cent und zeigen den Wert anders an. einfach!

4
gbjbaanb

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

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

1
David Bradley

gcc/clang (normalerweise) haben ihre eigenen Gleitkomma-Dezimalimplementierungen, wenn Ihre Distribution sich dafür entscheidet, sie in die gcc/clang-Version zu kompilieren, die sie anbieten (nicht bei einigen Arm-Distros, die ich ausprobiert habe). Aus diesem Grund benötigen Sie manchmal eine benutzerdefinierte Implementierung vom Dezimaltyp. Versuchen Sie mine für Ideen (getestet auf i586 bis aarch64).

0
user1095108