ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.06.25[金] 泥沼にハマる

「プログラムは思ったとおりに動かない。書いたとおりに動く」

とどこかで聞いたことがあるけど、書いた通りに動かないこともあります。

浮動小数点演算。

int main(void){
int i;
double d = 0;
for(i=0;i<10;i++){
d += 0.1;
}
if(d == 1.0f){
printf("hoge\n");
}
return 0;
}


と書く。d に0.1ずつ10回加算すれば1.0のはずなのだが、そう上手くは行かない。
二進数とか二進数とか二進数のせいで。

で、絶対に正確な計算をしたいと思ったので、正確な計算方法はないのかと調べてみると、二進化十進表現という方法を使うと良いらしい?のかなぁと思いつつも、これを実装するの面倒そうで、もっと他に方法がないか調べていたら、GMP - The GNU Multiple Precision Arithmetic LibraryMPFRというのを発見する。大きな数を扱うためのライブラリみたい。

で色々やってたんですが……mpfr_cmpという関数で値を比較するらしいけど、0.1ずつmpfr_addで加算して1.0にしたmpfr_t変数と1.0のmpfr_t変数を比較しても同じ値として扱ってくれない……。丸め誤差というのをどうにかしたら良いのだろうか……。ドキュメントを流し読みすると、大きな値を使えることはわかるんだけど、正確な値を使えるとかどこにも書いてないのに気付いた……。無限に続く値をどこかで切って比較すれば良いのかな。切り方がわからない……。

そして泥沼へ。

- 追記 -

勝手に切ることにした。正しいのかどうか不明……。
スポンサーサイト

Comment






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/124-09fcb3e7

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。