パスワードを忘れた? アカウント作成
13771662 journal
日記

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

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by tori_sanpo (39645) on 2018年11月19日 15時43分 (#3517918) 日記

    COBOL爺:「儂の出番かのぅ」

    • by Anonymous Coward

      十進BASIC: 「お前の出番はない」
      # MSX-BASICの浮動小数点はBCD(二進化十進数)だったので意味が分からなかったAC

      • by miyuri (33181) on 2018年11月19日 17時47分 (#3517997) 日記

        Visual Studio 2017方面なら、Decimal型というモノが有った。

        親コメント
        • by Anonymous Coward

          .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}{"{

  • by Anonymous Coward on 2018年11月19日 16時24分 (#3517948)

    なので最近のC言語でもfloatで計算すれば同じではないかと。

    • IEEE754の通りにやってるだけでしょうね。

      なので、100年後でも、float(単精度浮動小数点型)を指定して計算させたなら、
      やっぱり同じ結果になるんじゃないですかね。

      ちなみにperlの数値は基本的にdouble(倍精度浮動小数点型)なので、
      他の言語でも、doubleで計算するなら、やっぱりどれも同じ結果になると思われ。

      親コメント
  • by Technobose (6861) on 2018年11月19日 21時13分 (#3518102) 日記

     Python3.6(64bit)で試したところ、以下のようになりました。

     100 1.0000000000000007
     1000 9.999999999999831
     10000 100.00000000001425

     この結果からすると、実用的には、ほぼ期待したとおりの結果が出ていると思って良いのかな。

  • by Anonymous Coward on 2018年11月19日 20時10分 (#3518068)

    数十桁もない数字の変数に一度に数百万バイトもメモリ割り当てても余る時代に、
    浮動小数点の誤差の問題とか、なんで発生してるんだ?

    なんでこう基本的な部分を誰も正確に作らないんだろうね

    • 逆だ。
      ちゃんと正確に作っているからこそ、40年前と同じ結果が出てるんだ。

      同じデータ型で同じ計算をしたときに、同じ結果になってくれないと、
      機器の更新があった際なんかに、突然計算結果が変わっちゃって、
      それが致命的な事故やトラブルの原因になったりするんだよ。

      親コメント
    • by Anonymous Coward

      不可解な謎現象と勘違いしてスラドにたれ込むうっかりさんがいなくなったらつまらないだろ?

      • by Anonymous Coward

        へー、精度不足の計算が不可解に見えるんだ、キミおもしろいねw

    • by Anonymous Coward

      別に不正確なものを作っているわけじゃない。
      基本的な考えの元で「パソコン」が作られているわけで
      そのロジックにそって動いているだけの事。

      高精度の結果を要求されるものにパソコンで計算するのは
      ダメっていうのは常識なんだけどな。。。

    • by Anonymous Coward

      浮動小数点で計算すべきでないものを計算したから誤差が出ただけ。
      浮動小数点は元々、有効数字の範囲で誤差を許容した計算しかできない。

      誤差を許容できない計算をするなら、それ向きの型を使って計算してください。
      そういう型も色々な言語でサポートされてます。

      • 自分で型も指定せずに試しておいてなんだけど。

        誤差を許容できない計算をするなら、それ向きの型を使って計算してください。

        それが正解ですね。
        有効桁数を指定せずにただ実測値や表示される値をぶちこんで計算させてるレポートとか見ると毎回それを思ってしまう。

        親コメント
typodupeerror

普通のやつらの下を行け -- バッドノウハウ専門家

読み込み中...