6

このコードレビューの回答では:

https://codereview.stackexchange.com/a/59405/11633

次のものが見つかりました(ネストされた引用符が先にあります!):

すばらしい本 Numerical Recipes in C++ を引用させてください (ただし、適用可能です)

多項式を次のように評価しないことを十分に知っていると仮定します。

p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x+c[4]*x*x*x*x;

さらに悪いことに!)、

p=c[0]+c[1]*x+c[2]*pow(x,2.0)+c[3]*pow(x,3.0)+c[4]*pow(x,4.0);

(コンピュータ) 革命が来れば、そのような犯罪行為で有罪とされたすべての人は即座に処刑され、彼らのプログラムは処刑されません!

(あなたのエディションのページは、分析インデックスの「ダジャレ、特に悪い」というエントリの下にあります。私はこの本が大好きです。)

そうしない理由は 2 つあります。精度とパフォーマンスです。多項式を評価する正しい方法は次のようになります。

-t * (0.319381530  +  t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + 1.330274429 * t))))

推奨されない方法で実装するとパフォーマンスが大幅に低下することがわかりますが、精度が低下することはありません。精度にどのように悪いのですか?

私はその本を見つけましたが、引用された部分のどこにもこの情報はありませんでした.

4

1 に答える 1

7

各浮動小数点演算は単なる概算です。この方法では操作が少ないため、結果がより正確になります。

非常に大きな数または小さな数がある場合、別の利点があります。すべての係数が同じ大きさのオーダーであると仮定すると、そこにあるすべての項も同じオーダーになります。x=0.1 で約 1 の係数を持つ次数 5 の多項式を評価する場合、直接的な方法は 0.1 を 10^-5 に加算することであり、精度が失われます。

ちなみに、これはホーナーのスキームと呼ばれています。

于 2014-08-08T12:54:04.783 に答える