• ベストアンサー

浮動小数点数の誤差範囲を教えてください

猿より若干頭がいい、冴えないプログラマです。 面積を計算する際は必ず誤差がないように、doubleを使わずcurrencyを使っています。 メートルなら小数点4桁で足りますが、キロメートルとなると通貨型の4桁数では足りません。 doubleを使っても、平方キロを平方センチに変換して集計しても誤差は出ないでしょうか。 実際浮動小数点数はどの程度の誤差を生むのでしょうか。猿でも分かる程度教えてください。 基礎過ぎて動物園に帰れのような批判は勘弁してください。。。

noname#147912
noname#147912

質問者が選んだベストアンサー

  • ベストアンサー
  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.3

ネット上には色々な情報について詳しい解説や、分り易い説明のサイトが数多くあります。 質問された内容については、例えば次のようにサーチ条件を工夫してサーチして下さい。 倍精度浮動小数点 定義 精度 計算誤差 倍精度浮動小数点 解説 計算誤差 倍精度浮動小数点 解説 計算誤差 わかりやすい ==> (1) 日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml ==> (2) http://pc.nikkeibp.co.jp/pc21/special/gosa/ ◆“達人”芳坂和行氏に学ぶ、エクセル「演算誤差」対策講座 (1)の中にexcelの通貨型:currencyの計算のやり方、倍精度浮動小数点の表し方、計算精度や計算誤差などが分り易く説明されています。 "単精度と倍精度では表現できる桁数や大きさが違うわけですね" と言う言葉で(1)の中をサーチしてみて下さい。 10進17桁相当の桁数の精度があります。 地球表面の広さは、一周4万KMをcm単位で表示しても次の通りまだ7桁程余裕があります。 4*10**4(km)*1000(m)*100(cm)=4*10**9 さすがに地球表面積を平方cm単位で表そうとすると1.6*10**19(cm**2) のオーダーとなるので少し精度不足です。 平方m単位では 1.6*10**15(m**2) ですから精度的には十分です。 あなたの考えられている計算数値の一番厳しい条件の幾つかを例題として用意して、excelでcurrencyの場合、通常の場合(特に指定しなければ倍精度で計算される筈)を用意して試してみてください。 その場合、結果が分り易い数を使って下さい。 例えば、100000000999など なお小数点付きの数では10進形式から計算機内部の倍精度形式に変換する時に変換誤差が出ますが、多分10進12桁程度の精度で十分な通常の場合は問題になりません。

その他の回答 (2)

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.2

掛け算だけでしたらそんなに心配することはありません。 元の数の小数点以下の桁数が判っているなら、結果の小数点以下の桁数もわかるはず。 その範囲で丸めれば基本的には誤差は出ません。 ※もちろん有効桁数の範囲内での話です。

noname#146604
noname#146604
回答No.1

オーバーフロー/アンダーフロー 演算結果が指数部で表現できる範囲を超える場合があるが、最大値を超えた場合はオーバーフロー、絶対値の最小より小さい場合はアンダーフローという。IEEE 754の場合、アンダーフローは、まず結果が非正規化数となり精度が低下し、さらに進むと結果が0になる。 桁落ち 絶対値がほぼ等しい異符号の数値同士の加算後や、同符号でほぼ等しい数値同士の減算の後、正規化で有効数字が減少すること。詳細は桁落ちを参照。 情報落ち 浮動小数点数値を加減算するとき、指数を揃えなければならない。指数は絶対値の大きい方に揃えるが、このときに絶対値の非常に小さな値と絶対値の非常に大きな値との加減算を行うと、絶対値の大きな値の指数に揃えなければならないため、絶対値の小さな値は仮数部が大きく右シフトされ、仮数部の表現範囲からあふれて情報が欠落してしまう。情報欠落ともいう。詳細は情報落ちを参照。 積み残し 情報落ちが繰り返し起こる場合を言う。たとえば を n=0 の初項から計算しようとすると、ある項から情報落ちが起こり、それ以降の項が無視されてしまうことになる。これを積み残しと呼び、値の小さな項から加算をすることで対処する。 丸め誤差 仮数部の桁数が有限であるため、収まらない部分の最上位桁で四捨五入(2進法では0捨1入)して仮数部の桁数に丸めることによる誤差。

関連するQ&A

  • 浮動小数点数の誤差

    恐ろしく基本的なこと聞きます。 Public Class himajin100000 Shared Sub Main Dim foo As Double = 0.5 '2進数で表現できる Dim bar As Double = 0.1 '割り切れないから誤差が出る System.Diagnostics.Trace.WriteLine((foo - bar).ToString) '0.4 '・・・あれ?浮動小数点数の誤差どこ行った? End Sub End Class

  • 浮動小数点の計算について

    Javaで0.1+0.2を計算すると0.30000000000000004になったり、10.0-9.9を計算すると、0.09999999999999964になったりするのはなぜですか? 参考書では。 「浮動小数点数を使った計算では、一見正確な値が計算されてるように見えてもほとんど場合内部では少しだけ誤差を含んだ値を持ってると、考えた方がいいでしょう。どのような計算を行った時にどの程度の誤差が出るのかは難しい話題になるのでこの本では詳しく説明しませんが、例えば100.0-99.99のように同じぐらいの数同士で引き算を行うと誤差が現れやすくなります。」 と書いてありました。 この本ではこれだけで説明が終わりました。 なぜ浮動小数点で計算を行うと誤差が出るのか詳しく教えていただけると助かります。

    • ベストアンサー
    • Java
  • さっきの小数点切捨て→浮動小数点数の演算誤差について

    さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。 ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました) うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだことはある程度で、もちろん人に説明できるレベルではありませんが)そういうのってどんな場合にでるのでしょう。 さっきの質問の確認のため、Excel2002でオプションの計算のしかたなども変えてみてやったのですが、一度もそういう計算結果はでなかったのですよ。 でも、質問されている方がいるということはそういう計算結果もでるっていうことですよね。なので、どういう場合にそういう結果がでるのかと気になって。 さっきの質問の所に書き込もうかとも思ったのですが、他の方の質問にさらに質問するっていうのは失礼なような気もして、新しく質問しました。 先ほど答えていらっしゃった方でも、他の方でそういうことに詳しい方でもお時間あれば教えていただけないでしょうか。

  • 16ビット浮動小数点数の表現方法について

    学校の課題において、ある数を2進数で表現し、さらにその数を16ビット浮動小数点数で表しなさい。またそのとき生じる誤差の名称を記しなさい、という課題がでており取り組んでいるのですが、ネットで調べていても計算方法が理解できず行き詰っております。どなたか計算方法の手助けをお願いできないでしょうか。 与えられた条件 符号ビット:1ビット(0:正、1:負) 指数部:4ビット 仮数部:11ビット 16ビット浮動小数点数で表す数 10011100011000011 です。計算方法を理解したいので、なるべく詳しくお願いいたします。 誤差の名称もできればご教授願います。

  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

  • 浮動小数点とセットで使用される「e」について

    Javaの参考書で、以下のコードがありました。 『double d2=1.2345e-72』 質問1:このコードの「e」について、常用対数のことでしょうか? 質問2:1.2345e-72は、『1.2345*10の-72乗』でしょうか? 質問3:浮動小数点において、なぜ常用対数は必要なのでしょうか? その理由は、「浮動小数点の桁数を簡単にできるから。またdoubleの表現できる精度より高いそれ表現できるから」でしょうか?

    • ベストアンサー
    • Java
  • 浮動小数点演算を固定小数点演算へ変換する

    あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。 以下のようなプログラムがあります。 ------------------------------------------------------------- #define A 0.105 int main(){ double y; double a,b; double t1,t2 t1 = A * a; t2 = t1 * t1; y = t2 * b; printf("y = %lf\n",y); return 0; } ------------------------------------------------------------- a,bが入力でそれぞれ0~6000,0~0.004の値を取ることが分かっています。また、yは出力であり許容誤差は3以下となっています。 上記のプログラムを固定小数点数で記述しなおすとどのようになりますか。 各変数の型はshortでお願いします。

  • 浮動小数演算は実行環境の変化に応じて異なる結果に?

    プログラム(C++)について質問があります. 浮動小数演算を用いると,実行環境の変化に応じて結果が変わってしまうのでしょうか? プログラム中ではdouble演算を頻繁に用いています. (ソースコードは膨大すぎるため,申し訳ありませんが載せることが出来ません.) 小数演算をするために何気なくdouble(もしくはfloat)を使っていました. しかし,コンパイル後の実行ファイルを実行する環境に応じて結果が変わってしまうのでは・・・と思い始めました. そこで,ご質問なのですが, ・浮動小数を扱うと,実行環境(プロセッサ?)に応じて,結果は変わってしまいますか? また,もし誤差が生じてしまうならば,何か対処する方法はありますでしょうか? (整数演算にしろ!・・・と言うのは無しにさせて頂きます.) 初歩的な質問だと思いますが,宜しくお願い致します.

  • 浮動小数点数の float型 での最少値について調べています。

    浮動小数点数の float型 での最少値について調べています。 「Visual C++ 2008 Express Edition」の「float.h」の中には、    #define FLT_MIN     1.175494351e-38F   /* min positive value */    #define FLT_MIN_EXP  (-125)           /* min binary exponent */ という記述があります。 float型で表現できる最少値が「1.175494351e-38F」なのだろうと思い、 下記のように 2^-125 を計算してみました。    printf("結果は、「%e」です。", pow((double)2, (double)(-125))); 実行結果は、    結果は、「2.350989e-038」です。 となり、「float.h」の「FLT_MIN」には一致しませんでした。 試しに、下記のようにしてみると( 2^-125 を 2^-126 に変えてみました )    printf("結果は、「%e」です。", pow((double)2, (double)(-126)));    結果は、「1.175494e-038」です。 となって「float.h」の「FLT_MIN」と「ほぼ一致」しているように見えます。 float型での最小値(FLT_MIN)を計算する際に「float.h」での「FLT_MIN_EXP」を使って    2^-125 とするのは間違っているのでしょうか?

  • IEEE754と浮動小数点定数同士の演算について

    ■質問 浮動小数点の標準規格IEEE754に、浮動小数点定数同士の演算に関する規定はありますか? ■背景 とあるマイコンで組込みソフト開発をしています。 このマイコン用のコンパイラ(IEEEに準拠)で以下のCソースコードをコンパイルしたところ、コンパイラのバージョン1とバージョン2で演算結果が異なりました。 double d_val = 6.6f * 10.0f; ○コンパイルバージョン1でコンパイルしたソフトの演算結果 →d_valには66.0が代入されました。 ○コンパイルバージョン2でコンパイルしたソフトの演算結果 →d_valには65.999999…(詳細は失念)が代入されました。 コンパイラメーカーに問い合わせたところ、「バージョン1から2へのアップグレードにおいて、浮動小数点定数演算に関連する変更を行ったが、その影響は浮動小数点演算における誤差の範囲内である」との回答でした。 誤差の範囲内であるとはいえ、コンパイラのバージョン違いで演算結果が異なるのは困るので、これがIEEE754規格違反なのであれば、それを根拠にコンパイラメーカーへ対応を求められるのではないかと考えています。 しかし、浮動小数点定数同士の演算結果の正確性についての規定がないのであれば、開発側で対応するしかありません。 いろいろと調べてはいるのですが、これといった情報に行き当たっていないので、こちらで質問させていただきます。どうぞよろしくお願いいたします。

専門家に質問してみよう