4

10^-15 から 10^-25 の非常に少数のオーダーを使用するコードを扱っています。doubleandを使ってみたのですlong doubleが、0.000000000000000000001が四捨五入され0たり、 のような数字0.000000000000000020.00000000000000001999999999999

1/1000000 のわずかな部分でも、最終的な回答に大きな違いが生じるため、適切な修正はありますか?

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <iomanip>

using namespace std;

int main()
{
    double  sum, a, b, c,d;
    a=1;
    b=1*pow(10,-15);
    c=2*pow(10,-14);
    d=3*pow(10,-14);
    sum=a+b+c+d;
    cout<<fixed;
    cout<<setprecision(30);
    cout<<" a   : "<<a<<endl<<" b   : "<<b<<endl<<" c   : "<<c<<endl
        <<" d   : "<<d<<endl; 
    cout<<" sum : "<<sum<<endl<<endl;
    a=a/sum;
    b=b/sum;
    c=c/sum;
    d=d/sum;
    sum=a+b+c+d;
    cout<<" a   : "<<a<<endl<<" b   : "<<b<<endl<<" c   : "<<c<<endl
        <<" d   : "<<d<<endl; 
    cout<<" sum2: "<<sum<< endl;
    return 0;
}

予想される出力は次のようになります。

a   : 1.000000000000000000000000000000
b   : 0.000000000000001000000000000000
c   : 0.000000000000020000000000000000
d   : 0.000000000000030000000000000000
sum : 1.000000000000051000000000000000

a   : 1.000000000000000000000000000000
b   : 0.000000000000001000000000000000
c   : 0.000000000000020000000000000000
d   : 0.000000000000030000000000000000
sum1: 1.000000000000051000000000000000

しかし、私が得る出力は次のとおりです。

a   : 1.000000000000000000000000000000
b   : 0.000000000000001000000000000000
c   : 0.000000000000020000000000000000
d   : 0.000000000000029999999999999998
sum : 1.000000000000051100000000000000

a   : 0.999999999999998787999878998887
b   : 0.000000000000000999999997897899
c   : 0.000000000000019999999999999458
d   : 0.000000000000029999999999996589
sum1: 0.999999999999989000000000000000

doublelong doubleさらにを試しboost_dec_floatましたが、得られる出力は似ています。

4

2 に答える 2

0

私はあなたが書いているに違いない:

long double  sum, a, b, c,d;
a=1;
b=1*pow(10,-15);
c=2*pow(10,-14);
d=3*pow(10,-14);

問題は、が pow のダブルpowバージョンになることです。長いダブル バージョンではありません。引数の 1 つを強制的に long double にする必要があります。

long double  sum, a, b, c,d;
a=1;
b=1*pow(10.0L,-15);
c=2*pow(10.0L,-14);
d=3*pow(10.0L,-14);
于 2017-01-10T10:54:50.853 に答える