関数の近くに有する特異点X = 0。以下のため:かかわらず、その特異性は、持ち上げることができる、X = 1、一つは持つべきであるF (X )= 1をので、 E 、X = Σ K = 0 のx K したがって (ex−1)/x=∑k=1x k − 1
Q:関数には名前がありますか?つまり、これは一般的な問題ですか?
Q:この状況をうまく処理するC / C ++ライブラリを知っている人はいますか。つまり、0に近い適切な次数のテイラー展開と、ゼロから離れた他の表現を使用していますか。
関数の近くに有する特異点X = 0。以下のため:かかわらず、その特異性は、持ち上げることができる、X = 1、一つは持つべきであるF (X )= 1をので、 E 、X = Σ K = 0 のx K したがって (ex−1)/x=∑k=1x k − 1
Q:関数には名前がありますか?つまり、これは一般的な問題ですか?
Q:この状況をうまく処理するC / C ++ライブラリを知っている人はいますか。つまり、0に近い適切な次数のテイラー展開と、ゼロから離れた他の表現を使用していますか。
回答:
これはキャンセルエラーのインスタンスです。C標準ライブラリ(C99現在)には、expm1
この問題を回避するための関数が含まれています。のexpm1(x) / x
代わりに使用する場合(exp(x) - 1.0) / x
、この問題は発生しません(下のグラフを参照)。
この特定の問題の詳細と解決策は精度と数値アルゴリズムの安定性のセクション1.14.1で長々と議論します。同じ解決策は、W。Kahanの論文 『浮動小数点計算における丸めの無意味な評価とはどのように無駄なのか?』の19ページでも説明されています。。expm1
GNU Cライブラリでの実際の実装は、上記の参考文献で説明されているアプローチとは異なり、ソースコードで完全に文書化されています。
最初の質問に答えるために、いいえ、関数には名前がありません(少なくとも広く知られている名前はありません)。
他の人が述べたように、関数を計算する最良の方法はいくつかの特別な場合を扱うことです。これは、ライブラリが関数を計算する方法です。
double
2e-8
5e-4
expm1(x)/x
。切り捨てられたテイラー級数を使用すると、より洗練された特別なケースになりますが、おそらくそれだけの価値はありません。実際、k1が指摘したように、キャンセルは安全であるため、ケース1を個別に処理する必要があることは完全には明らかではありません。ただし、それを個別に処理することで、それについてより自信を持つことができます。
最初の質問に答え、2番目の(おそらく数値的に非効率な)方法を提供するために、これはベルヌーイ数の生成関数の逆であることに注意してください。