web-dev-qa-db-ja.com

C ++ 10進データ型

C++プログラムでdecimal32decimal64、またはdecimal128などの10進データ型を使用する方法はありますか?

34
fpiro07

Decimal TR のクラスは、すべてのコンパイラに実装されているわけではありません。 gcc などの一部のコンパイラは、 C Decimal TR を実装し、C++でも対応する拡張機能を提供します。過去には、C++ Decimal TRのオープンソース実装がありましたが、見つけることができませんでした。コンパイラが小数型をサポートしていない場合、最良のオプションはおそらくIBMの decNumberライブラリ のラッパーを作成することです。

C++の将来の状況を改善するために、 TRを更新する計画 を作成し、現在のTRを次のC++委員会会議(4月)の準備ができた完全な提案に変えます。私が持っている実装は私の通常の仕事の一部であり、それが一般に利用可能になるかどうかを決めるのは私次第ではありませんある時点でオープンソース化できることを期待しています。

26
Dietmar Kühl

テンプレートを使用して、C++の使いやすいヘッダーのみのソリューションを使用できます。 https://github.com/vpiotr/decimal_for_cpp

これは* Big* Decimalクラスではないことに注意してください。 64ビットの「仮数」桁に制限されています。

[リンクから取得]

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

int32またはint64を使用し、(手動で)希望する位置に小数点をシフトします。たとえば、ドルを測定する場合は、代わりにセントを測定し、値を別の方法で表示します。シンプル!

4
gbjbaanb

Boostにはcpp_dec_floatもあります。それが標準に採用されるまで、おそらく最良のソリューションです。

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には(通常)独自の浮動小数点10進実装が付属しています(ディストリビューションが提供するgcc/clangバージョンにコンパイルすることを決定した場合)これが、カスタムのdecimal型の実装が必要になる場合がある理由です。 mine を試してみてください(i586でaarch64までテスト済み)。

0
user1095108