21

10 進浮動小数点演算を実行できる C++ クラスを探しています。http://speleotrove.com/decimal/を見ると、人々が書いたが維持していないあらゆる種類のクラスへのリンクがあります。decNumber++ の内容を掘り下げると、GCC が最終的にこの機能をサポートすることを示す電子メールがいくつか届きました。(正式には ISO/IEC TR 24733 として知られています)

他の人が自分のプロジェクトで使用している float または double のドロップイン代替品として使用できるものを探しています。うまくいけばオープンソース。

ありがとう!

編集:これを使用して価格を表そうとしていることを指摘しておく必要があります。したがって、巨大な小数ではなく、正確な小数が必要です。

4

9 に答える 9

16

これをサポートし、C++ バインディングも持つGMP (GNU 多倍精度ライブラリ)と呼ばれる巨大なライブラリが存在しますが、正直なところ、C++ インターフェイスは少し不安定で時代遅れです。

ドキュメントの例では、以下はf少なくとも 500 ビットの精度で呼び出される float を作成します。

mpf_class f(1.5, 500);
于 2011-01-25T21:06:02.017 に答える
9

好きなのを選びな。そこにはたくさんのそれらがあります。たとえば、ウィキペディアのリストを参照できます。

于 2011-01-25T21:06:07.773 に答える
4

質問は少し古いですが、同じニーズを持つ他の人にとっては: Boost.multiprecision はおそらくあなたが探しているものです。

http://www.boost.org/doc/libs/1_57_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

これは、10 進数を処理できる任意精度のライブラリです。

于 2015-04-13T10:43:34.207 に答える
3

GMP を使用し、すべてをセントとして保存します。2^32 セント (42.949673 百万ドル) を渡さないことがわかっている場合は、32 ビットの unsigned int を使用 (または 64 ビットの unsigned int を使用) し、シンプルに保ちます。

于 2011-01-26T06:49:19.270 に答える
3

巨大な 10 進数値を操作する必要がある場合は、http://gmplib.org/ライブラリを使用することをお勧めします。私は C と C++ でよく使ってきました。

于 2011-01-25T21:06:06.527 に答える
3

これには遅すぎるかもしれませんが、128 ビットの 10 進数は機能しますか? これらは C++ に受け入れられており、少なくとも gcc には gcc-4.5 (現在 4.9 を開始しています:

#include <iostream>
#include <decimal/decimal>

using namespace std;

int main()
{
  {
    std::decimal::decimal32 dn(.3), dn2(.099), dn3(1000), dn4(201);
    dn-=dn2;
    dn*=dn3;
    cout << "decimal32 = "  << (dn==dn4) << " : " << decimal32_to_double(dn) << endl;
  }

  {
    std::decimal::decimal64 dn(.3), dn2(.099), dn3(1000), dn4(201);
    dn-=dn2;
    dn*=dn3;
    cout << "decimal64 = "  << (dn==dn4) << " : " << decimal64_to_double(dn) << endl;
  }

  {
    std::decimal::decimal128 dn(.3), dn2(.099), dn3(1000), dn4(201);
    dn-=dn2;
    dn*=dn3;
    cout << "decimal128 = " << (dn==dn4) << " : " << decimal128_to_double(dn) << endl;
  }

  return 0;
}

float と同じサイズの decimal32 と、ほとんどの double と同じサイズの decimal64 があることに注意してください。したがって、decimal128 はかなり大きいです。ウィキペディアから: Decimal128 は 34 桁の仮数と、-6143 から +6144 の指数範囲をサポートします。(同等に、±00000000000000000000000000000000×10−6176 ~ ±999999999999999999999999999999999×106111)

mpfr ライブラリは、任意精度の 2 進浮動小数点であり、任意精度の 10 進数ではありません。違いがあります。

于 2013-04-14T01:39:59.270 に答える
0

おそらく、「MAPM、C のポータブル任意精度数学ライブラリ」が探しているものです。また、C++ ラッパーも含まれています。

http://www.tc.umn.edu/~ringx004/mapm-main.html

于 2011-01-25T21:05:42.063 に答える
0

これは BCMath PHP から C++ への実装です。Qt 用と STL 専用の 2 つのバージョンがあります。

ソース: https://github.com/DesarrollosCuado/BCMath-for-Cpp

BCMath::bcscale(4); //Num Decimals
BCMath test("-5978");

test^=30; //Pow, only integers. Not work decimals.
std::cout<<"Result BigDecimal 1: "<<test.toString().c_str()<<std::endl;

test-=1.23; //sub
std::cout<<"Result BigDecimal 2: "<<test.toString().c_str()<<std::endl;

test*=1.23; //mul
std::cout<<"Result BigDecimal 3: "<<test.toString().c_str()<<std::endl;

test*=-1.23; //mul
std::cout<<"Result BigDecimal 4: "<<test.toString().c_str()<<std::endl;

BCMath::bcscale(70); //Num Decimals

BCMath randNum("-5943534512345234545.8998928392839247844353457");
BCMath pi("3.1415926535897932384626433832795028841971693993751058209749445923078164062862");

BCMath result1 = randNum + pi;
BCMath result2 = randNum - pi;
BCMath result3 = randNum * pi;
BCMath result4 = randNum / pi;

std::cout<<"Result Super Precision 1: "<<result1.toString().c_str()<<std::endl;
std::cout<<"Result Super Precision 2: "<<result2.toString().c_str()<<std::endl;
std::cout<<"Result Super Precision 3: "<<result3.toString().c_str()<<std::endl;
std::cout<<"Result Super Precision 4: "<<result4.toString().c_str()<<std::endl;

//Other example
BCMath::bcscale(4); //Num Decimals
std::cout<<"Other 1: "<<BCMath::bcmul("1000000.0134", "8.0234").c_str()<<std::endl;
std::cout<<"Other 2: "<<BCMath::bcadd("1000000.0134", "8.0234").c_str()<<std::endl;

std::cout<<"Compare 1:  "<<BCMath::bccomp("1", "2")<<std::endl;
std::cout<<"Compare 2:  "<<BCMath::bccomp("1.00001", "1", 3)<<std::endl;
std::cout<<"Compare 3:  "<<BCMath::bccomp("1.00001", "1", 5)<<std::endl;
std::cout<<"Compare 4:  "<<(BCMath("1")< BCMath("2"))<<std::endl;
std::cout<<"Compare 5:  "<<(BCMath("1")<=BCMath("2"))<<std::endl;
std::cout<<"Compare 6:  "<<(BCMath("1")> BCMath("2"))<<std::endl;
std::cout<<"Compare 7:  "<<(BCMath("1")>=BCMath("2"))<<std::endl;
std::cout<<"Compare 8:  "<<(BCMath("2")< BCMath("2"))<<std::endl;
std::cout<<"Compare 9:  "<<(BCMath("2")<=BCMath("2"))<<std::endl;
std::cout<<"Compare 10: "<<(BCMath("2")> BCMath("2"))<<std::endl;
std::cout<<"Compare 11: "<<(BCMath("2")>=BCMath("2"))<<std::endl;

std::cout<<"Round 1: "<<BCMath::bcround("123.01254").c_str()<<std::endl;
std::cout<<"Round 2: "<<BCMath::bcround("-123.01254", 3).c_str()<<std::endl;
std::cout<<"Round 3: "<<BCMath::bcround("123.01254", 2).c_str()<<std::endl;
pi.round(3);
std::cout<<"Round 4: "<<pi.toString().c_str()<<std::endl;

BCMath part1("-.123");
BCMath part2(".123");
BCMath part3("123");
std::cout<<"Int part 1: "<<part1.getIntPart().c_str()<<std::endl;
std::cout<<"Dec part 1: "<<part1.getDecPart().c_str()<<std::endl;
std::cout<<"Int part 2: "<<part2.getIntPart().c_str()<<std::endl;
std::cout<<"Dec part 2: "<<part2.getDecPart().c_str()<<std::endl;
std::cout<<"Int part 3: "<<part3.getIntPart().c_str()<<std::endl;
std::cout<<"Dec part 3: "<<part3.getDecPart().c_str()<<std::endl;

結果:

Result BigDecimal 1:  198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113024
Result BigDecimal 2:  198005530669253749533290222782634796336450786581284861381777714804795900171726938603997395193921984842256586113022.7700
Result BigDecimal 3:  243546802723182111925946974022640799493834467494980379499586589209898957211224134482916796088524041355975600919018.0071
Result BigDecimal 4:  -299562567349513997668914778047848183377416395018825866784491504728175717369805685413987659188884570867849989130392.1487

Result Super Precision 1:  -5943534512345234542.7583001856941315459727023167204971158028306006248941790250554076921835
Result Super Precision 2:  -5943534512345234549.0414854928737180228979890832795028841971693993751058209749445923078164
Result Super Precision 3:  -18672164360341183116.9114783895073349180904753962992796943871920962352436079118338887287186
Result Super Precision 4:  -1891885794154043400.2804849527556211973567525043250278948318788149660700494315139982452600

Other 1:  8023400.1075
Other 2:  1000008.0368

Compare 1:   -1
Compare 2:   0
Compare 3:   1
Compare 4:   true
Compare 5:   true
Compare 6:   false
Compare 7:   false
Compare 8:   false
Compare 9:   true
Compare 10:  false
Compare 11:  true

Round 1:  123.0125
Round 2:  -123.013
Round 3:  123.01
Round 4:  3.142

Int part 1:  -0
Dec part 1:  123
Int part 2:  0
Dec part 2:  123
Int part 3:  123
Dec part 3:  0
于 2014-05-25T20:16:58.210 に答える