2007年03月01日 18:45 [Edit]

53/100*100 =

他のLL言語でも試してみた。

いやなブログ - 浮動小数点演算ではまった話
浮動小数点演算のありがちな問題ではまりました。

とりあえず手元にあるもので。言語はアルファベット順。インタラクティブ環境があるものはインタラクティブに。

awk

% echo | awk '{print 53/100*100}' 
53

bc

% bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
53/100*100
0
53.0/100*100
0
53*100/100
53

haskell

% ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> 53/100*100
53.0

JavaScript

フィールドをクリックして実行。
alert(53/100*100); // 53

perl

% perl -de 1

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   1
  DB<1> p 53/100*100
53

python

% python
Python 2.3.5 (#1, Jan 13 2006, 20:13:11) 
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 53/100*100
0
>>> 53.0/100*100
53.0

R

> 53/100*100
[1] 53

ruby

% irb
irb(main):001:0> 53/100*100
=> 0
irb(main):002:0> 53.0/100*100
=> 53.0

scheme (gauche)

% gosh
gosh> (* (/ 53 100) 100)
53.0

他にもあればこちらまでTBないしcommentを。

Dan the Man with Too Many Floating-Point Numbers to Process


この記事へのトラックバックURL

この記事へのトラックバック
浮動小数点演算結果を整数に丸めると直感に反する結果が出るという高林さんの考察と、
53.0 / 100 * 100 = ? in LabVIEW【Even More Addicted to Indentation】at 2007年03月02日 20:31
この記事へのコメント
タイトルが間違ってるような気が...

誤) 53*100/100 =
正) 53/100*100 =
Posted by heiwa4126 at 2007年03月01日 19:00
heiwa4126さん、
ありがとうございます。修正しました。
Dan the Out-of-order Evaluator
Posted by at 2007年03月01日 19:06
;; scheme (gauche)
(* (/ 53 100) 100) ;=> 53.0

;; Common Lisp (clisp)
(* (/ 53 100) 100) ;=> 53

;; Emacs Lisp (Meadow)
(* (/ 53 100) 100) ;=> 0

そりゃそうだ
Posted by りすふ at 2007年03月01日 20:25
Gauche は 0.8.8 から整数同士の割り算で有理数を返すようになりましたよ。

gosh> (* (/ 100 53) 53)
100
Posted by Black at 2007年03月01日 21:21
なでしこでやってみました.

ソース:
53/100*100を表示.

答え: 53

という結果になりました.
ちなみになでしこのバージョンは「1.3992」です.
Posted by 桐生哲史 at 2007年03月01日 21:33
PHP:
> phpcli -r "{print 53/100*100;}"
> 53
(phpcli はコマンドライン版 php へのエイリアス)

gnuplot:
> print 53.0/100.0*100.0
> 53.0
(すべて整数で書くと 0,1つでも小数表記にすると53.0)
Posted by RET at 2007年03月01日 22:17
言語なのかバックエンド確認なのかよく判りませんが。

Google
http://www.google.com/search?q=53/100*100
Posted by skim at 2007年03月02日 01:57
うーん、このテストは2重の意味でピントを外しているように思いました。0.53で問題が出るのは「80bit拡張浮動小数点数表現から直接floorを取った場合」というのが元記事ですよね。
(1)LL言語ではほとんどの場合計算結果をいちいちdoubleにして保持するだろうから、元記事にあるように丸めがおきて誤差は観測されない
(2)処理系が拡張浮動小数点数そのままで値を保持していたとしても、print時の丸めによって"53.0"と表示されてしまう可能性が高い。

もし処理系内部での精度について問題にしたいのであれば、少なくとも結果を表示させるのではなくリテラルの53.0と比較する、といった配慮が必要かと。
Posted by shiro at 2007年03月02日 06:25
まさに便乗バッドラッパー記事
Posted by a at 2007年03月02日 19:39