わかっているようでわからないこと
2009年06月01日
25.0 × 8.28 = 207
なのですが、プログラム君はちがうことがある。
たとえばC#では
double a = 25 ;
double b = 8.28 ;
double c = Math.Truncate( a * b ) ; ← 整数部分とりだし関数
とすると C=206となる。
なんとなくわかっているけれど、
大量のソースコードの中で、これでおかしくなっているのを
見つけるのは容易ではない。
そんな今日このごろでした。
なのですが、プログラム君はちがうことがある。
たとえばC#では
double a = 25 ;
double b = 8.28 ;
double c = Math.Truncate( a * b ) ; ← 整数部分とりだし関数
とすると C=206となる。
なんとなくわかっているけれど、
大量のソースコードの中で、これでおかしくなっているのを
見つけるのは容易ではない。
そんな今日このごろでした。
Posted by いちごソフト開発 at 00:18│Comments(2)
この記事へのコメント
C#は使っていませんがコレを見つけるのは大変そうですね。
ビットの演算ですから、誤差は避けられませんね。
PHPですが数ヶ月前に32ビット環境で掛け算の処理結果でドジをしました。
2変数の掛け算の結果が端数を含むため、intval()を通して整数値を取得するようにしていたのですが、演算結果が32ビットで収まらないため、結果が見事にマイナスになっていました。
有限なビットの世界で動いていることを思い出した瞬間でした。
ビットの演算ですから、誤差は避けられませんね。
PHPですが数ヶ月前に32ビット環境で掛け算の処理結果でドジをしました。
2変数の掛け算の結果が端数を含むため、intval()を通して整数値を取得するようにしていたのですが、演算結果が32ビットで収まらないため、結果が見事にマイナスになっていました。
有限なビットの世界で動いていることを思い出した瞬間でした。
Posted by 植物お世話係 at 2009年06月06日 19:29
植物さん
とくにC#というわけではないです。
今回はC++/CLIでした。
ビットの世界は難しいですね。
とくにC#というわけではないです。
今回はC++/CLIでした。
ビットの世界は難しいですね。
Posted by いちごソフト開発 at 2009年06月07日 01:09