|
級数で展開された関数の近似値がどの程度確保できるか、確認してみた。関数は、sinで、sin(30度) = 0.5 を確認する。 ●原理 ○sin展開式 sin(x) = (-1)k * x(2*k+1) /(2 * k + 1)! [k = 0 to ∞] ○ラジアン 度をラジアンに変換する。R = D * π / 180 ●方法 自作のUltraMathにて展開式を実際に演算し、値を確認する。1000桁まで求める。 ●結果 ○精度がでない! 計算結果を1000桁印刷したが、どうも半分ぐらいしか出ていない。やはり、級数には限界があるのか? 色々調べた結果、なんとラジアンに変換する時の π の精度が原因であった。上記の π は、500桁のものであった。下記が、定数 π の精度を指定して生成する文である。π は予め、10000桁求めて、文字列で持っている。 Friend Shared umPI As New UltraLong(strUPI.Substring(0, 500)) ○ π の精度を1010桁で実験 Friend Shared umPI As New UltraLong(strUPI.Substring(0, 1010)) 見事に、1000桁まで精度が出た。表示では、1000桁以降に有限の値(誤差)があることを示している。当然、絶対に、0.5 にはならない。 ●考察 級数展開は、正直であり、信頼できる。但し、定数の精度もキッチリ出しておかないといけない。当たり前であるが、少し、感動した。逆に、筆者が求めたπ も正確だと言うことになる。 蛇足であるが、定数を常に最大の精度で使用すると、演算時間が幾何級数的に延びることになる。とくに乗算など。ループの中で定数を使う時は、最適な精度にして置くのが良い。 |