値i(精度)を求め、式1 +1/1!を使用してeを計算する簡単なプログラムを作成するように求められました。 + 1/2! + 1/3! +⋯+ 1! 私は非常に近い値を得ていますが、それでも正しくありません。どこが間違っていたのですか?コードを改善する方法は何ですか?改善のためのループを使用して定数を計算するC++プログラム
#include <iostream>
using namespace std;
int main()
{
double e=0.0;
double factorial=0;
int i=0;
int j,k=0;//counter variables
cout<<"Enter degree of accuracy: ";
cin>>i;
for(j=0;j<=i;j++) //for loop to calculate 'e'
{
factorial=1; //To reset factorial to 1 for every value of j
for(k=1;k<=j;k++)//for loop to calculate factorial
{
factorial*=k;
}
e+=(1/factorial);
}
cout<<"Value for e given i: "<<e<<endl;
system("pause");
return 0;
}
なぜ精度を大幅に向上させることができると思いますか?作業しているデータ型は固定精度です。あなたが何をしても1/3! 「double」で計算されるように、数学的な1/6に等しくなることはありません。あなたが望むことができる最大値は、異なる計算ステップからの誤差をやや打ち消すことですが、決して完全に打ち消すことはありません。 –
@ n.m。 - 実際の算術演算では、加算(他の演算の中でも)は連想的です。すなわち、(a + b)+ c = a +(b + c)である。対照的に、浮動小数点演算では加算は**結合ではありません**。つまり、一般的に '(a + b)+ c!= a +(b + c)'です。操作の順序は、エラーの取り消しがなくても、計算の合計エラーに非常に大きな影響を及ぼす可能性があります。そのため、OPは彼のプログラムの精度を向上させることができるのです。詳細は、私の答え(特にカーハン和アルゴリズムへのリンク)を参照してください。 –
@TedHoppあなたは正しいです、Kahanの合計がそうであるように、合計を後方に実行すると結果が改善されます。私の驚いたことに、エラーは最初の最後の重要なビットにしかなかった。 –