20

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

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

4

7 に答える 7

22

Boost.Multiprecisionライブラリには、 と呼ばれる 10 進数ベースの浮動小数点テンプレート クラス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;
    }    
}
于 2013-03-10T08:46:32.050 に答える
7

はい:

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

于 2013-03-10T08:26:32.683 に答える
5

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

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

于 2013-06-22T18:14:52.773 に答える
4

常にある程度の精度があります。どのコンピュータでも、どのような数値表現でも、正確に表現できる数字とそうでない数字が常に存在します。

  • コンピューターはベース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進数ベースの数値の正確な計算、たとえば、いくつかの金銭的な計算では?

于 2013-03-10T08:19:57.817 に答える
3

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

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;

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

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

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

于 2013-03-10T08:01:14.207 に答える
0

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

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

于 2013-03-10T07:45:18.607 に答える
-3

高水準言語であるPHPことは、あなたが「不正確」と呼ぶものを断ち切るだけですが、それは確かにそこにあります。C / C ++では、結果を整数型にキャストすることで同様の効果を得ることができます。

于 2013-03-10T07:33:10.177 に答える