• 締切済み

計算精度(限りなくゼロに近く)

現在、fortranで大きな数値計算をしています。 そこで、計算回数が多く、その計算過程において大きい値と小さい値とを何回も計算していると誤差が次第に大きくなっていきます。 A=BとなるようにA(又はB)を求めるときの判別としてabs(A-B)<10**(x) としています。 このxに-300ぐらいの値をいれ判別したいのですがそれは可能ですか? もちろん計算には倍精度を使っていますがabs(A-B)が10**(-17)付近になると値が一定になってしまいます。これがfortranの限界なのでしょうか?

みんなの回答

noname#21649
noname#21649
回答No.3

fotranで.尋常な方法ではないのですが.物理制限のみという演算をしたことがあります。 変数を整数配列にして.1桁を1配列に割り当てて.演算ルーチンを作成します。 三角関数や対数程度でしたらば.探せば.加減算で求めるプログラムも公開されていますから.開発は特に困難ではないでしょう。 私の場合には.マンマシンインターフェースとして.対話処理にしたことが災いし.プログラム領域が不足し.オーバーレイ構造にするためには.システム情報が必要となり.一般ユーザーであるために開発を断念しました。システム情報を操作するためには.特権ユーザーである必要があったためです。

回答No.2

> A=BとなるようにA(又はB)を求めるときの判別としてabs(A-B)<10**(x) > としています。 絶対誤差がいいんですかね。 相対誤差も検討してみてください。

  • hero1000
  • ベストアンサー率29% (114/390)
回答No.1

倍精度の有効桁数は16~17桁ですから、大体そこが精度の限界になります。 計算の誤差に詳しいページを示しておきますね。(参考URL)

参考URL:
http://www.pu-toyama.ac.jp/joker/1999kouki/c8.htm

関連するQ&A

  • MATLABの計算精度

    いま,  A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8  if( A(I)>=0 )   a=a+A(I)*0.25;  else   a=a+A(I)*0.75;  end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.

  • 精度、近似値について

    AとBの関係(比)について計算しています。 A=365.24219...  B= 224.62... とすると、 両者の関係はA÷B もしくは B÷Aで表されますよね? 計算結果1.62604... 0.614989... となりました。 この場合の精度?近似する数字として、 1.6250という値と、0.61500という値はどの位正確と言えるのでしょう? 前者ですと1000分の1位の誤差、後者ですと少数点第1位から数えて、10000分の1位の誤差と表現するのでしょうか? 実際は後者のほうが正確なのでしょうか?? そもそも比の話なので、具体的なモノの精度ではありませんが、世間で言う『1万分の1の精度』とかケタ数での精度表現との関係はいかがでしょうか?

  • 計算時間の精度

     現在,OSがWindows2000でtimeGetTime関数をtimeBeginPeriodと一緒に使用しています. そこでtimeGetTimeの精度を検証するために,timeGetTimeの間に「1+1」を複数回入れてtimeGetTime関数の精度を検証しました.  結論から言うと「1+1」の計算回数を多くするほど標準偏差が増加する傾向がみられました.  前置きが長くなりましたが,ここからが質問です. 「1+1」のような計算の計算時間は一定なのでしょうか? この標準偏差の増加の原因がtimeGetTimeの誤差の蓄積なのか,「1+1」の誤差の蓄積なのか,どちらの影響が大きいと考えられるのか教えてください. 宜しくお願いします

  • 単精度計算と倍精度計算

    F(x)=(1-x・x)1/2乗において、xの値を0.9、0.99、…0.99999と変化させた場合の単精度計算と倍精度計算の結果を求めるプログラムを教えてください。

  • 推測の精度を求めるには?

    プログラムを作って、日によって異なる、ある行動を起こした時間を推定しました。実際にその行動を起こした時間と比較して、このプログラムの精度を求めたいと考えました。 実際に行動を起こした時間が、3日間で、 A1- 6:18, A2- 10:21, A3- 12:38... プログラムで推測の時間が B1- 6:30, B2- 10:11, B3- 12:53... とすると、誤差(偏差?)は(12,-10,15...)となります。これは、ほぼ正規分布に従っていました。この誤差の平均や、標準偏差などが精度の指標になると思っていますが、正しい方法と、そういった値の正しい名称を教えていただきたいです。

  • 数値計算で生じる小さなごみ

    ある問題を数値的に解こうと思いFortranでプログラムを組んでいるのですが、倍精度の数値計算で以下のような事が起きて困っています。 プログラムの中で A=B-C*D (変数は全て倍精度実数変数) のような代入文があるのですが、 write(*,*) B,C,D とすると、0.250000000000000 0.500000000000000 0.500000000000000 と表示されるのですが、 write(*,*) B-C*D や write(*,*)A では-1.79570984817912D-017 などと表示されます。(この数値に意味はないのでしょうが、同じシチュエーションでは常に同じ値が表示されます) 入力した値の精度外の「誤差」ですが、どこに原因のある問題でしょうか? 因に使っているコンパイラはintelのサイトで入手したフリーの評価版ifc ver.6 でそれにpentium4に最適化するオプションをつけてコンパイルしています

  • 熱電対で高精度温度測定

    おねがいします。 融点付近の地温を高精度(±0.05℃以下)で測ることは可能でしょうか? 測定範囲は-10℃から10℃くらいまででよいのですが。 どのロガー会社にきいても0.5℃までですといわれます。 しかし、冷接点の温度を測る温度計(サーミスタ)の精度がキャリブレーションで0.02℃くらいまで出せるのであとは熱電対自体の安定性ですが、これもあるように思います。 そして、熱電対の出力電圧が小さいのでこれを増幅する過程で誤差がおおきいのかとも考えています。

  • 繰り返し計算中に定数が変わってしまいます

    現在FORTRAN77を用いて繰り返し計算を行っています. ところが計算を繰り返しているうちに一定の値として与えているはずのものが勝手に別の値になってしまいます. 具体的に例をあげますと, a=1.00000 だったものがいきなり a=1.7532423E-16 とかになります. このaの値は繰り返しの度に何かから読み込んでいるものではなく,計算の最初に与えてしまい,最後まで変化しないはずのものです. ですので原因がわからず困っています. 何か原因がわかる方がいらっしゃいましたらアドバイスお願いいたします.

  • 有効数字  特に、約分・計算順序について

    とある問題で、     9.8 × ( 24 × 60 × 60 )^2   ━━━━━━━━━━━━━    ←÷の分数表記です    4 × ( 3.14 )^2 × 6.4 × 10^5 という数の計算がありました。 どう計算するのがもっとも精度がいいのでしょうか? ※ 有効数字は 9.8  2桁              3.14 3桁             6.4  2桁             24 × 60 × 60 は正確な値としてよい。              4   は正確な値としてよい。 なお、値の精度は、誤差○.○~□.□があるから、ではなく、桁数のみで判定してください。(大学入試的な意味で) ちなみに、手元の答えでは≒2.9 × 10^2となっています。私は初め2.3 × 10^2になりました(←計算間違いではなく 泣 ) 計算途中の切り捨て、約分、計算の順序、四捨五入、等、できるだけ詳しく計算過程を記述してほしく思います。

  • δをつかった式

    物理の計算なのですが、数学に近い要素があったので こちらで質問しました。 測定値a,bに一定の誤差が生じる。 これらa,bに関する関係式はX=a^2-b^2で 誤差を含んだ測定値をa+δa,b+δbとする。 このとき関係式は X=a^2-b^2+2(aδa-bδb)+(δa^2-δb^2) となる。 このときもっとも値に影響を及ぼすのは第二項である。 とあったのですが、なぜ第二項なのですか? 値が大きく変化する理由を教えてください。