by イグトランス » 2007年2月21日(水) 14:54
それはCPUの都合上の問題でABの問題ではありません。
x86を始めとした現存する多くのCPUでは浮動小数点数も二進法で表現します。
十進法では有限小数だった数でも二進法で表現すると無限小数となることがあり,
無限を扱えない現代のコンピュータでは適当なところで桁を捨てるため誤差を生じることとなります。
そのためそのように一見正しくないような結果となるのです。
通常は画面へ表示するなど文字列として表現する際に,適当な桁数で丸めるなどして
下のほうの桁を見せないといった工夫によって問題を隠し,それが対処法としては最も簡単です。
もし厳密さを求めるとしたら十進法主体で表現すれば良いのです。
二進法の浮動小数点数は通常±x * 2 ^ nという形で表現され,メモリやレジスタ上ではxとnと符号を記録しています。
しかし±x * 10 ^ nの形式で演算すれば,今回の例のような十進法と二進法の違いによる誤差はだいぶ防げるはずです。
あるいはx / yというような有理数(分数)として演算するという手もあります。
いずれにしても自分でそのようなコードを書かなければなりませんし,その他の種類の誤差の発生にも気を付けなければ台無しです。
それはCPUの都合上の問題でABの問題ではありません。
x86を始めとした現存する多くのCPUでは浮動小数点数も二進法で表現します。
十進法では有限小数だった数でも二進法で表現すると無限小数となることがあり,
無限を扱えない現代のコンピュータでは適当なところで桁を捨てるため誤差を生じることとなります。
そのためそのように一見正しくないような結果となるのです。
通常は画面へ表示するなど文字列として表現する際に,適当な桁数で丸めるなどして
下のほうの桁を見せないといった工夫によって問題を隠し,それが対処法としては最も簡単です。
もし厳密さを求めるとしたら十進法主体で表現すれば良いのです。
二進法の浮動小数点数は通常±x * 2 ^ nという形で表現され,メモリやレジスタ上ではxとnと符号を記録しています。
しかし±x * 10 ^ nの形式で演算すれば,今回の例のような十進法と二進法の違いによる誤差はだいぶ防げるはずです。
あるいはx / yというような有理数(分数)として演算するという手もあります。
いずれにしても自分でそのようなコードを書かなければなりませんし,その他の種類の誤差の発生にも気を付けなければ台無しです。