パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

NetBSD 7.0リリース。」記事へのコメント

  • そんなにいいの?

    • by Anonymous Coward

      例えば、1から1000000000までの合計を求める

      luajit -e 'local x=0; for i=1,1e9 do x=x+i end; print(x)'

      このコードが、3770Kでも1秒以下で計算されちゃうとそりゃね。
      LuaJITじゃなくて、素のLuaの方ですら8秒とかだもの。
      C/C++のようなネイティブはともかく、JavaやGo、すごいよHaskellですら単純計算では相手になりませんわ。

      ちな、クソ遅いことで有名なRubyで同じことやってみ?
      どう書いても3分とかかかるよwww

      • by Anonymous Coward

        手元の 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, 興味深い)

          by Anonymous Coward

          えーそんなに遅くなるのかあと思ってうちの 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

          まあ、こんなもんか。

          • by Anonymous Coward

            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 になると思

            • by Anonymous Coward

              別ツリーに書いてたけどLua 5.3は64bit整数を導入したからでしょ。しかも1e9とか書く(丸めの可能性を気にもかけない)アホでも正しく計算できるように自動的に適切な内部型を選んでいるようだ(実行結果を見る限り)。むしろGCCでなんで誤差が出ないのか謎だ

              • by Anonymous Coward

                むしろGCCでなんで誤差が出ないのか謎だ

                x87が80bitだからだろ。

              • by Anonymous Coward

                x86でもdoubleは64bitでlong doubleでないと80bitにはならなかったと思うが。最適化の結果最終段の出力以外は全部レジスタ上で行われるので80bitの精度が得られてしまうってこと?

              • by Anonymous Coward on 2015年10月12日 9時12分 (#2898099)

                最適化の結果最終段の出力以外は全部レジスタ上で行われるので80bitの精度が得られてしまうってこと?

                x87使えばそうなるよ。

                親コメント
              • by Anonymous Coward

                gcc -S -mno-sse2で出力眺めると確かにそうなっていた。なるほど

              • by Anonymous Coward on 2015年10月12日 15時17分 (#2898188)

                ちなみに変数を整数にしたら500000000500000000を即値でprintfに渡すだけのコードになった。浮動小数点数だと分配法則が成り立たないからこの手の最適化ができないわけだな(そのわりに精度が途中だけ80bitになってもいいというのがよくわからんが)。

                親コメント
              • by Anonymous Coward

                そのわりに精度が途中だけ80bitになってもいいというのがよくわからんが

                浮動小数点演算は概算であること理解してないとわからんかもね

              • by Anonymous Coward

                概算でいいと適当に精度を勝手に変えてもいいの違いが理解できない奴には質問の意味すらわからんだろうね

              • by Anonymous Coward

                概算であるというのは人間による演算結果の評価にすぎず、浮動小数点演算の結果はIEEE754やIntelのマニュアルで厳密に定められているのだが

              • by Anonymous Coward

                「厳密に定められてる」って、浮動小数点演算の丸めのルールすら理解してないっぽいね。

              • by Anonymous Coward

                浮動小数点演算の結果はIEEE754やIntelのマニュアルで厳密に定められているのだが

                なるほど、じゃあWikipediaのIEEE 754の項目に書かれてる
                https://ja.wikipedia.org/wiki/IEEE_754 [wikipedia.org]

                算術その他の演算で使用される形式は、符号化したときのものと一致していなくても構わない(つまり、実装は、内部で異なる表現を使用してもよい)。
                この標準では、精度(有効桁数)を拡張した形式を示し、基本形式よりも精度を高くすることを

              • by Anonymous Coward

                モードがいっぱいあるのと、あるモードの動作が厳密に定められているのは別の話じゃないかなあ。

                実数演算と浮動小数点演算は違うというのは当たり前ですが、
                浮動小数点演算結果と浮動小数点演算結果が異なるのは当たり前じゃないです。
                必ず理由があります。
                IEEE754は無限精度で演算して、結果を格納する時に丸めます。
                モードとかが一致していれば変わるわけがないです。
                言うまでもありませんが、丸め方法は決まっています。1つじゃないですが。

                ただし真面目に考えてないコンパイラとかが多いのはその通り。
                IEEE754はfloat, double変数に代入されるビットパターンの意味だと
                思うくらいの方が安全だね。
                昔はCとかでそんなこと追求する人はいなかった、かな? Fortran使えと。

              • by Anonymous Coward

                「浮動小数点演算の結果はIEEE754やIntelのマニュアルで厳密に定められているのだが」の意味分かってない人?

              • by Anonymous Coward

                IEEE754は無限精度で演算して、結果を格納する時に丸めます。
                モードとかが一致していれば変わるわけがないです。

                安定の分かってない感すごいなw
                コンピュータは不思議な仕組みで動いてる呪術的なものって認識なのかなあ。

Stay hungry, Stay foolish. -- Steven Paul Jobs

処理中...