web-dev-qa-db-ja.com

C ++の正確な10進データ型?

PHPには10進型があり、floatやdoubleの「不正確さ」がないため、2.5 + 2.5 = 5であり、4.999999999978325などではありません。

では、CまたはC++にそのようなデータ型の実装があるのだろうか?

18
dtech

はい:

C++には任意精度のライブラリがあります。
良い例は GNU Multiple Precision算術ライブラリ

7
Martin York

Boost.Multiprecision ライブラリには、 cpp_dec_float 、任意の精度を指定できます。

#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_dec_float.hpp>

int main()
{
    namespace mp = boost::multiprecision;
    // here I'm using a predefined type that stores 100 digits,
    // but you can create custom types very easily with any level
    // of precision you want.
    typedef mp::cpp_dec_float_100 decimal;

    decimal tiny("0.0000000000000000000000000000000000000000000001");
    decimal huge("100000000000000000000000000000000000000000000000");
    decimal a = tiny;         

    while (a != huge)
    {
        std::cout.precision(100);
        std::cout << std::fixed << a << '\n';
        a *= 10;
    }    
}
20

お金/通貨をサポートするデータ型を探している場合は、これを試してください: https://github.com/vpiotr/decimal_for_cpp

(これはヘッダーのみのソリューションです)

5
Piotr

常にある程度の精度があります。任意の数値表現のコンピュータには、正確に表現できる数値とできない数値が常に存在します。

  • コンピューターはベース2システムを使用します。 0.5(2 ^ -1)、0.125(2 ^ -3)、0.325(2 ^ -2 + 2 ^ -3)などの数値は正確に表されます(上記の場合は0.1、0.001、0.011)。

  • ベース3システムでは、これらの数値を正確に表すことはできませんが(半分は、0.111111 ...)、他の数値は正確に表すことができます(たとえば、2/3は0.2になります)。

  • 人間の基数10のシステムでも、正確に表現できない数値があります。たとえば、1/3です。

  • 有理数表現を使用でき、上記はすべて正確です(1/2、1/3、3/8など)が、常にいくつかの無理数もあります。また、この表現の整数のサイズによっても実質的に制限されます。

  • 表現できない数値ごとに、表現を拡張して明示的に含めることができます。 (たとえば、有理数と表現a/b + c/d*sqrt(2)を比較します)が、正確に表現できない数は常に多くなります。そう言う数学的な証明があります。

だから-私はあなたにこれを尋ねさせてください:あなたは正確に何が必要ですか?たぶん、10進数ベースの数値の正確な計算。いくつかの金銭的な計算では?

4
CygnusX1

あなたが求めているのは反物理学です。

Phyton(およびC++も)が行うことは、有効桁数を減らすことによって、印刷時に結果を丸めることによって不正確さを排除することです。

double x = 2.5;
x += 2.5;
std::cout << x << std::endl;

xを小数点以下6桁の精度で印刷し(x自体は12を超える)、5に丸められ、不正確さを排除します。

代替案は浮動小数点をまったく使用せず、整数の「スケーリングされた」算術を実行するデータ型を実装します:25/10 + 25/10 = 50/10;

ただし、これにより、各整数型で表される上限が減少することに注意してください。精度(および正確性)が向上すると、オーバーフローへの到達が速くなります。

有理数も可能であり(各数値は「分子」と「分母」で表されます)、分数に対する精度の低下はありません(実際には、正確でない限り実行されません)が、数値が増加するにつれて再び増加します操作の数が増えると(「有理数」が少ないほど、分子と分母が大きくなります)、オーバーフローのリスクが高くなります。

言い換えれば、有限数のビットが使用されるという事実は(どのように編成されていても)常に、大きな数の側で小さな側で支払わなければならない損失をもたらします。

3

あなたはPHPのバイナリ電卓について話していると思います。いいえ、CランタイムまたはSTLにはありません。しかし、あなたがそんなに傾いているならば、あなたはあなた自身を書くことができます。

これは、FacebookのHipHop forPHPを使用してコンパイルされたBCMathのC++バージョンです。 http://fossies.org/dox/facebook-hiphop-php-cf9b612/dir_2abbe3fda61b755422f6c6bae0a5444a.html

0
Hawk Eye