プログラミング機能_2
このスクリプト機能を使って、三角関数も300桁で計算可能です。(下記参照)

 カルキングでは、累乗根の計算を、300桁に近い精度で与えてくれるようになりました。 どうやら、スクリプトの応用のようです。ここでは試しに、xが小さい数値であれば収束の早い eの計算をやってみます。

 テーラー展開の式は、次のような級数になっています。 各項は、前の項をx/k倍しています。

 これをプログラムにすると、次のようになります。 aがループの各サイクルでx/k倍される変数で、初期値は1です。bは得られたaを加算していく変数です。 無限桁の変数を使って無限回繰り返せば、正確なデータが得られますが、それはあり得ない話です。 「カルキング」の変数の精度が、300桁止まりなので、漸減していく a が10-300以下で作業を打ち切り、脱出するようにしました。

 for文ですが、while文があればそれを使うところ
です。でも、to の後へ来る end値を大きくすれば、
殆んど同じ働きになります。

 プログラムを試作する段階で、無限ループに悩ま
される場合も考慮して、小さい目の数値から始め、
結果を見ながら決めるか、最後に大きな数字に書
き換えるのがいいのではないかと考えます。
 勿論、その都度、実行 関数定義 します。

 脱出時の bの値が戻り値です。 For文の中の300なら、e1=e で、aが10-300以下になって、breakにより脱出することを確認済みです。 exp1(100)のような途方も無い計算をさせる人でなければ、10000みたいな大きな数値を入れておけば十分です。
 (追記) x が負の数では、余り計算をしない内に a が負になって break します。 break条件は、絶対値が小さな値になるのを求めて、|a|<10-300とするのが正解でした。

 結果が同じになることが期待される計算を3つしてみました。 末尾の777449に続く部分が計算誤差のようです。 下の欄に記入した「より精度の高いデータ」から抜粋したデータと較べると、2乗、4乗と掛け算の回数を多くするほど誤差が大きくなるみたいです。


 同じようなテーラー展開の計算で、自然対数を求めてみます。 xが0に近い場合なら簡単に収束してくれます。 この計算で桁数を大きくした場合、x=1、即ち y=2 で、ln(2) の計算を高精度で求めようとすると、驚くほど長い時間がかかります。
 実は、1-1/2+1/3-1/4+・・・ は収束しないのです。 要注意です。

 y=1+x と置いてx=y-1 と考えて式を組みます。 a は x を与える変数で、b,c は + と - を別個に積算する変数です。
 for文のパラメータ k をループの中でインクリメント(k=k+1)しています。 計算させてみて結果が正しければ、こんなことをしてもいいのですね。 自己流でやっていた頃の整数演算ではこんな具合でしたが、カルキングは、実数演算(というより、負数を使った乗除算)が特別の配慮無しにできますので、右のような関数で構いません。

 実数計算で、c項は不要。
  (修正しました)
(注) xが負(即ち、yが1未満)の場合、
break文のaには絶対値が必要。
 絶対値処理済。

 こちらも300桁で計算してみました。

 ln1の関数と、ln2の関数(結果省略)では、末尾の4桁くらいで差異が出ます。


 以上は、特別の配慮の要らないレベルの数値(引数)に対する関数定義によるものです。引数の絶対値が大きくなっても殆んど同じ時間で結果が得られる工夫をしたプログラムを作りました。 これらを収録したファイルをe-book「関数グラフ入門」の付録フォルダ「math」の中にscript4_7.clk として収録しました。(ver1.20以降)

 その中には、eの応用により、三角関数や双曲線関数も収録、三角関数では、度分秒入力も可能です。又、逆三角関数も収録し、sin(x)とcos(x)を計算しy=tan(x)にして、得られた結果をtan-1(y)を使って、検算で精度を確認することも可能です。

 自然対数は lnrv(x)、常用対数は logrv(x) です。 これらの関数は、精度アップのため細かい工夫をしています。その結果、指数関数と組み合わせて結果を求めても、末尾2〜3桁のあたりの誤差で納まります。


script4_7.clk の使い方

 そのファイルの中の関数群は、「カルキング」の定義関数と混合使用した際に混同することを避けるため、通常使われる関数と違う名前をつけています。

 e に該当するものは、exp_e(x) です。 10 に該当するものは、exp_10(x) です。 三角関数は、通常 sin_3(x) と cos_3(x) を使います。 度分秒の入力には、degv(d,m,s) を使います。 逆三角関数は、atanv3(x) と asinv3(x) です。

 これらの関数群は、全て、このファイルの中の右ページに定義してあります。作業は、全てこのファイルの中で実行するか、自分専用で使うために、「別名」をつけて保存してその中で作業してください。

 このファイルの定義関数類をコピーで別ファイルへ貼り付けても、それを使うための定義にはかなりのエネルギーが必要です。又、ユーザー関数として、ライブラリ登録するにも、かなりの手間が掛かるはずです。 定義内容をプリントアウトしたいときは、印刷可能な左ページへ移してください。

 左ページにある使用例は、既にプロパティが定義済みです。普通に使えば、300桁モードです。「計算式の表示精度とそれに関連する slen=148(表示桁数/2-2: 代入定義した変数)」を小さく定義すれば、自分の求めたい精度レベルで計算することも可能です。 

 次のページ へ進む。

 トップページ へ戻る。

 前のページ へ戻る

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送