手元の lua でやってみた。(3770Kじゃないけど) $ time lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)' 500000000500000000 lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)' 30.09s user 0.02s system 99% cpu 30.207 total $ lua -v Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio
Luaって結構聞くけど (スコア:0)
そんなにいいの?
Re: (スコア:0)
例えば、1から1000000000までの合計を求める
このコードが、3770Kでも1秒以下で計算されちゃうとそりゃね。
LuaJITじゃなくて、素のLuaの方ですら8秒とかだもの。
C/C++のようなネイティブはともかく、JavaやGo、すごいよHaskellですら単純計算では相手になりませんわ。
ちな、クソ遅いことで有名なRubyで同じことやってみ?
どう書いても3分とかかかるよwww
Re: (スコア:1)
手元の lua でやってみた。(3770Kじゃないけど)
$ time lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)'
500000000500000000
lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)' 30.09s user 0.02s system 99% cpu 30.207 total
$ lua -v
Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio
Re: (スコア:2, 興味深い)
えーそんなに遅くなるのかあと思ってうちの Celeron 1037U 1.8GHzで試してみた。
lua-5.3.1 を MinGW-W64-builds-4.2.0 でビルド後、
$ time lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)'
500000000500000000
real 0m18.358s
user 0m0.000s
sys 0m0.015s
まあ、こんなもんか。
Re: (スコア:0)
Cygwin上のLuaJITとLuaで確認してみたが何でか結果が違う。
$ luajit -v
LuaJIT 2.0.4 -- Copyright (C) 2005-2015 Mike Pall. http://luajit.org/ [luajit.org]
$ time luajit -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)'
5.0000000006711e+17
real 0m1.982s
user 0m1.513s
sys 0m0.015s
$ lua -v
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
$ time lua -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)'
5.0000000006711e+17
real 0m22.038s
user 0m19.312s
sys 0m0.046s
$
Luaは知らんが (1+1e9)/2*1e9 = 5.000000005e17 になると思
Re: (スコア:0)
別ツリーに書いてたけどLua 5.3は64bit整数を導入したからでしょ。しかも1e9とか書く(丸めの可能性を気にもかけない)アホでも正しく計算できるように自動的に適切な内部型を選んでいるようだ(実行結果を見る限り)。むしろGCCでなんで誤差が出ないのか謎だ
Re: (スコア:0)
x87が80bitだからだろ。
Re: (スコア:0)
x86でもdoubleは64bitでlong doubleでないと80bitにはならなかったと思うが。最適化の結果最終段の出力以外は全部レジスタ上で行われるので80bitの精度が得られてしまうってこと?
Re: (スコア:1)
最適化の結果最終段の出力以外は全部レジスタ上で行われるので80bitの精度が得られてしまうってこと?
x87使えばそうなるよ。
Re: (スコア:0)
gcc -S -mno-sse2で出力眺めると確かにそうなっていた。なるほど
Re: (スコア:1)
ちなみに変数を整数にしたら500000000500000000を即値でprintfに渡すだけのコードになった。浮動小数点数だと分配法則が成り立たないからこの手の最適化ができないわけだな(そのわりに精度が途中だけ80bitになってもいいというのがよくわからんが)。
Re:Luaって結構聞くけど (スコア:0)
浮動小数点演算は概算であること理解してないとわからんかもね
Re: (スコア:0)
概算でいいと適当に精度を勝手に変えてもいいの違いが理解できない奴には質問の意味すらわからんだろうね
Re: (スコア:0)
概算であるというのは人間による演算結果の評価にすぎず、浮動小数点演算の結果はIEEE754やIntelのマニュアルで厳密に定められているのだが
Re: (スコア:0)
「厳密に定められてる」って、浮動小数点演算の丸めのルールすら理解してないっぽいね。
Re: (スコア:0)
なるほど、じゃあWikipediaのIEEE 754の項目に書かれてる
https://ja.wikipedia.org/wiki/IEEE_754 [wikipedia.org]
Re: (スコア:0)
モードがいっぱいあるのと、あるモードの動作が厳密に定められているのは別の話じゃないかなあ。
実数演算と浮動小数点演算は違うというのは当たり前ですが、
浮動小数点演算結果と浮動小数点演算結果が異なるのは当たり前じゃないです。
必ず理由があります。
IEEE754は無限精度で演算して、結果を格納する時に丸めます。
モードとかが一致していれば変わるわけがないです。
言うまでもありませんが、丸め方法は決まっています。1つじゃないですが。
ただし真面目に考えてないコンパイラとかが多いのはその通り。
IEEE754はfloat, double変数に代入されるビットパターンの意味だと
思うくらいの方が安全だね。
昔はCとかでそんなこと追求する人はいなかった、かな? Fortran使えと。
Re: (スコア:0)
「浮動小数点演算の結果はIEEE754やIntelのマニュアルで厳密に定められているのだが」の意味分かってない人?
Re: (スコア:0)
安定の分かってない感すごいなw
コンピュータは不思議な仕組みで動いてる呪術的なものって認識なのかなあ。