nemui4の日記: 0.01を10000回足したら100.003になる 16
日記 by
nemui4
30年前のBASICで「0.01を10000回足したら100.003」になると書いてあったので、今の環境で試してみたら同じ結果だった話
https://togetter.com/li/1289806
30年前の名著「数値計算の常識」を読んでたらBASICで0.01を10000回足したら100.003になるとか書いてあった。まあ昔のPCなんてそんなものかなと思いながら、Visual Studio 2017で試してみたら同じ結果だったw pic.twitter.com/HBwJhlhZjc
手近のターミナルからperlで繰り替えし回数を変えながらやるとなんだか酷い(型知らんし)。
繰り返し:結果
100:1
1000:9.99999999999983
10000:100.000000000014
老兵は死なず (スコア:2)
COBOL爺:「儂の出番かのぅ」
Re: (スコア:0)
十進BASIC: 「お前の出番はない」
# MSX-BASICの浮動小数点はBCD(二進化十進数)だったので意味が分からなかったAC
Re:老兵は死なず (スコア:2)
Visual Studio 2017方面なら、Decimal型というモノが有った。
Re: (スコア:0)
.NET関連なら、PowerShellで簡単に確認出来るのでやってみた。
まず、#3517959 [srad.jp]の通り、同じになるか確認でdouble型でやってみる。
PS> 100,1000,10000|%{1..$_|%{[double]$x=0}{$x+=0.01}{"{0}:{1}"-f$_,$x}}
100:1
1000:9.99999999999983
10000:100.000000000014
日記と同じ結果。
内部保持可能な17桁を確認するために書式指定すると下記のように。
PS> 100,1000,10000|%{1..$_|%{[double]$x=0}{$x+=0.01}{"{0}:{1:G17}"-f$_,$x}}
100:1.0000000000000007
1000:9.9999999999998312
10000:100.00000000001425
本題のdecimal型
PS> 100,1000,10000|%{1..$_|%{[decimal]$x=0}{$x+=0.01}{"{
たんせいどふどうしょうすうてん (スコア:1)
なので最近のC言語でもfloatで計算すれば同じではないかと。
Re:たんせいどふどうしょうすうてん (スコア:2)
IEEE754の通りにやってるだけでしょうね。
なので、100年後でも、float(単精度浮動小数点型)を指定して計算させたなら、
やっぱり同じ結果になるんじゃないですかね。
ちなみにperlの数値は基本的にdouble(倍精度浮動小数点型)なので、
他の言語でも、doubleで計算するなら、やっぱりどれも同じ結果になると思われ。
Python3の結果 (スコア:1)
Python3.6(64bit)で試したところ、以下のようになりました。
100 1.0000000000000007
1000 9.999999999999831
10000 100.00000000001425
この結果からすると、実用的には、ほぼ期待したとおりの結果が出ていると思って良いのかな。
今の時代にまだやってんのかよ (スコア:0)
数十桁もない数字の変数に一度に数百万バイトもメモリ割り当てても余る時代に、
浮動小数点の誤差の問題とか、なんで発生してるんだ?
なんでこう基本的な部分を誰も正確に作らないんだろうね
Re:今の時代にまだやってんのかよ (スコア:1)
逆だ。
ちゃんと正確に作っているからこそ、40年前と同じ結果が出てるんだ。
同じデータ型で同じ計算をしたときに、同じ結果になってくれないと、
機器の更新があった際なんかに、突然計算結果が変わっちゃって、
それが致命的な事故やトラブルの原因になったりするんだよ。
Re: (スコア:0)
不可解な謎現象と勘違いしてスラドにたれ込むうっかりさんがいなくなったらつまらないだろ?
Re: (スコア:0)
へー、精度不足の計算が不可解に見えるんだ、キミおもしろいねw
Re: (スコア:0)
別に不正確なものを作っているわけじゃない。
基本的な考えの元で「パソコン」が作られているわけで
そのロジックにそって動いているだけの事。
高精度の結果を要求されるものにパソコンで計算するのは
ダメっていうのは常識なんだけどな。。。
Re: (スコア:0)
高精度の結果を要求されるものにパソコンで計算するのは
ダメっていうのは常識なんだけどな。。。
おもしろおかしい
Re:今の時代にまだやってんのかよ (スコア:1)
以前居たところの経理の人は電卓は信用してるけどExcelは信用できないそうで、毎回検算してたっけ。
Re: (スコア:0)
浮動小数点で計算すべきでないものを計算したから誤差が出ただけ。
浮動小数点は元々、有効数字の範囲で誤差を許容した計算しかできない。
誤差を許容できない計算をするなら、それ向きの型を使って計算してください。
そういう型も色々な言語でサポートされてます。
Re:今の時代にまだやってんのかよ (スコア:1)
自分で型も指定せずに試しておいてなんだけど。
誤差を許容できない計算をするなら、それ向きの型を使って計算してください。
それが正解ですね。
有効桁数を指定せずにただ実測値や表示される値をぶちこんで計算させてるレポートとか見ると毎回それを思ってしまう。