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

東京海上日動の新システムはCOBOLを採用」記事へのコメント

  • 古い人間なんで、金の計算と帳票処理にはCOBOL以外のプログラミング言語なんぞ思いつかん
    • by NOBAX (21937) on 2008年09月09日 13時06分 (#1417916)
      と言えばCOBOLで決まりです。
      良いものは良い。
      なんか文句がある人がいるんでしょうか。
      親コメント
      • by Anonymous Coward
        確かに COBOL には、二進化十進を扱う言語仕様がありますが、 二進化十進がうれしいのは、二進化十進の数値表現を扱う機械命令を もった計算機(主に IBM互換機) での話であって、それ以外の機械では、 二進化十進そのものにありがたみがないのではないでしょうか。
        • 知らない人も多そうだが実はx86も持ってる二進化十進演算ニモニック。
          # ただしCOBOLを実装するに当たって有用かどうかは知らない :p
          親コメント
          • by Anonymous Coward
            そういえば6502にもあったような。
            使ったことないし詳しくは知らないが。
            • by Anonymous Coward
              オリジナルにはあったけど、ファミコンのカスタム版にはありませんでした。

              #全命令の内、これだけなかった。確かになくてもあまり困らんかったが。
        • by mhe03222 (6917) on 2008年09月09日 17時04分 (#1418097)
          1米ドル=107.71000円の時の150米ドルが何円になるかを計算してみよう。
          小数点未満は四捨五入で。
          Excelと電卓は16157円になった。
          親コメント
          • by Anonymous Coward on 2008年09月09日 18時51分 (#1418178)
            これはさずがに、COBOL で書くのが最も簡単でしょうね。

            では次の問題はどうでしょう。COBOL でも Java の BigDecimal でも、記述の面倒さは同程度かと思われます。

            単価 123円45銭 数量 678円のときの金額を求めよ。ただし、 金額が 1万円以上の場合は、100円未満は四捨五入。
            親コメント
            • Re:二進化十進 (スコア:1, すばらしい洞察)

              by Anonymous Coward on 2008年09月09日 19時11分 (#1418196)
              出題エラー:数量に円は許されない型です。
              親コメント
              • by Anonymous Coward
                > 出題エラー:数量に円は許されない型です。

                絶対に許されないことはありません。

                ひょっこりひょうたん島のトラヒゲデパートでは、現金を商品として売っていました。数量の単位として円もありえます。
              • by Anonymous Coward
                設計ミスでしょう
                商品名は百円玉で、数量の単位は個が妥当です。

                # 百円玉一個ありました
              • by Anonymous Coward
                あなたの業界では設計ミスかもしれません。しかし、最近日本国から独立を宣言したヘナチョコ共和国の国境付近では、日本国政府の円を売る商売があって、商品は日本円で数量の単位は円です。
        • IBM互換機って言った時に、メインフレームを思い出す人と
          PC/ATを思い出す人とどっちが多いんでしょ?

          後者は最近ではWindows互換機と呼ぶことが多い?
          --
          -- う~ん、バッドノウハウ?
          親コメント
          • by Anonymous Coward
            後者の呼び方はAT互換機だなぁ。世間ではDOS/Vマシンと呼ばれることが多かったような。
            前者は使ったことないから知らん。ACOSは互換じゃなかったので。
            N社のCOBOLプリプロセッサのCOBOL/Sは結構面白かったな。
        • by Anonymous Coward
          そう思うなら、手近な言語で0.1を1万回足してみなよ。
          • Re:二進化十進 (スコア:3, おもしろおかしい)

            by aruefu (34582) on 2008年09月09日 18時05分 (#1418148) 日記
            では”ぴゅう太 日本語BASIC”で。

            10 シキ SUM=0
            20 マワレ 40 I=1 カラ 10000 カンカク 1
            30   シキ SUM=SUM+0.1
            40 トジル
            50 カケ 1,SUM
            60 オワリ

            ・・・しまった、「ジッコウ」しようにももう実機もってない・・・。
            親コメント
          • Re:二進化十進 (スコア:2, すばらしい洞察)

            by TarZ (28055) on 2008年09月09日 15時54分 (#1418039) 日記
            C82-BASIC (CASIO FP-1100)

            LIST
            10 SUM=0
            20 FOR I=0 TO 10000-1
            30   SUM=SUM+0.1
            40 NEXT
            50 PRINT SUM
            RUN
            1000
            OK
            親コメント
            • by sadole (27157) on 2008年09月10日 16時08分 (#1418760)
              FP-1100ってのがいいね。
              内部10進演算を行うBASICだもんね。
              Z80なのによくやるよ。
              (おかげで実行速度は犠牲になってますが)
              親コメント
              • Z80はFPUも無く整数の乗除算も出来ないCPUですが、加減算についてはBCD補正命令があります。
                そういうCPUでソフトウェアで小数の演算を実装する分には、10進にしてもそれほど速度的なオーバヘッドは無いと思います。

                通常の加減算は16bit演算できるのに対しBCDだと8bit演算しなきゃいけないので、多倍長演算をするのに加減算の手間が二倍になるオーバーヘッドが大きいでしょう。でも、乗除算演算を実装する場合には、それ以外の処理が大多数を占めますし、それよりも、プログラマの腕(コードの質)の方が支配的でしょう。

                内部10進をデメリットとしては、速度よりもメモリ的なオーバヘッドの方が大きいような気がします。
                親コメント
            • by Anonymous Coward
              なぜBASICの例でわざわざFP-1100が名指しで・・・
              と不思議に思った数秒後に、
              FP-1100のBASICは10進演算していたのを思い出した。(だから遅かったよNE!)

              ・・・懐かしい思い出をありがとう。
              • あとはMSX-BASICもBCD=二進化十進法ですね。
                Z-80にもDAA命令があるのでBCD演算の実装はまあ、浮動小数の実装と比べて、
                そんなに極端な差は出ないと踏んだんでしょうけど、
                MSXのユーザーの大半は使ってなかったと言う…。
                あと懐かしいといえばNCB(Number Crunch BASIC)てのもありましたねー。
                ナンバークランチングをBASICでやろうと言うのも凄い話なんですが(^^;
                とにかくBCDを実装した言語はパソコンにも割とあったと言うお話です。

                ちなみにIA-32のSIMD命令にもちゃんとBCD演算を考慮した命令(四則演算)は残ってますし、
                IBMメインフレームじゃなくても、実装は十分出来ると思うんですけどね。
                だいたい、BCDじゃなくても、有効桁数がある程度設計で見えているなら、
                64ビット整数で固定小数点演算にすれば、誤差は少ないですからJavaで何が悪い、
                と言う事にもなるんでしょうね。
                言語選択より、計算精度なんてもともとプログラミング時にプログラマが設計すべきものでしょ。

                なので、COBOLである必要性、と言うと…書式が厳密。と言う点はあるかもしれないですが、
                BCD演算に優位性がある、と言われると、うーんと考えてしまいます…。
                親コメント
              • by Anonymous Coward
                > 計算精度なんてもともとプログラミング時にプログラマが設計すべきものでしょ。

                正気の沙汰ではありませんね。
                ひょっとして御社ではそれでシステムの設計をなさってる…?
              • 複数の企業に在籍してきてますが、ゲーム会社でもそれ以外の企業でも至極当然の事でやってましたが?
                極端な例を書けば、MPEGビットストリームでは各パートごとに有効ビット数がありますし、
                ゲーム機の演算ハードウェアは有効ビット数が決まってます。
                いや、それ以前にアセンブラ使うならレジスタのビット長をちゃんと把握して無いと計算できませんよ?
                C/C++を使う場合も、自分の使っている演算長はちゃんと把握していないと固定小数点演算なんて、
                アンダーフローやオーバーフローをバリバリ出してあっという間に計算が破綻するなんて割とざらですが?
                FloatやDoubleだって、有効ビット数を考えて居ないと、たとえば演算で回転変換をかけたりすると、
                数回転しただけで破綻しますよ。

                ・・・そこまで極端な事を言わなくても、たとえば、浮動小数を使っている、と言う自覚があれば、
                当然誤差の含まれた計算をしている、という意識が働くわけで、数値を==で比較する、なんて、
                阿呆なコードは書かないわけで、(NANや初期化直後の0とかは除いて…)、いずれにしろ、これも
                「演算精度をプログラマが自覚している」って事でしょ?
                むしろ上記を考えない、と言うのはプログラマとして大問題を抱えてるのではないですか?
                親コメント
              • by Anonymous Coward
                >「演算精度をプログラマが自覚している」って事でしょ?
                > むしろ上記を考えない、と言うのはプログラマとして大問題を抱えてるのではないですか?
                当然プログラマは精度等について自覚している必要はあります。

                でもそれは
                > 計算精度なんてもともとプログラミング時にプログラマが設計すべきものでしょ。
                とは何の関係もないことです。
                普通の会社では、精度は「プログラミングよりずっと前に」「むしろプログラマ以外の人が」設計するものですが、ホント。

                あなたがたは与えられた精度を満たすようなコードを書いているだけで、設計時の精度の決定には噛んだ経験はなさそう、
                もしくは、愚か者ゆえにそこから何も学ばなかった(ベンジャミン・フランクリン)ようですね。

              • >ちなみにIA-32のSIMD命令にもちゃんとBCD演算を考慮した命令(四則演算)は残ってますし、

                IA32のSIMDにBCD命令って何かありましたっけ?
                もちろん、整数演算でBCDを実現することは不可能ではないでしょうけど…

                親コメント
              • by TarZ (28055) on 2008年09月10日 12時44分 (#1418610) 日記

                もちろん、整数演算でBCDを実現することは不可能ではないでしょうけど…
                これってどうやるのでしょう? どういったものか、ぱっとイメージできないのですが。
                親コメント
              • 失礼しました。SIMDで扱えるのは通常の整数四則演算まででしたね。
                FPUおよびCPU一般命令でBCDを扱う命令がありますの間違いです。

                ちなみにSIMDでBCDは全く扱えないか、と言うと、工夫次第である程度はいけそうです。
                整数で実現する方法はと言うと、BCDを実現するには
                ハーフキャリー(ハーフボロー)を監視すればよいのですが、
                SIMDだけでやるとアンパックして、更にビットをずらしてまたアンパック後に、
                比較命令でマスク生成してマスクを4ビットずらして加算してパックして更にパック。…と、面倒くさいですね。
                失礼しましたです。
                親コメント
              • こんな感じですかね?
                加算だと

                __int64 a, b ; // アンパック BCD
                __int64 c = 0xF6F6F6F6F6F6F6F6, d = 0x0505050505050505,
                    e = 0x0606060606060606, f = 0x0A0A0A0A0A0A0A0A, g = 0x0F0F0F0F0F0F0F0F ;

                __asm
                {
                movq mm0, a
                movq mm1, b
                movq mm4, f
                paddb mm0, mm1
                pcmpgtb mm4, mm0
                paddq mm0, c
                pand mm0, g
                movq mm1, mm0
                pcmpgtb mm0, d
                pand mm4, mm0
                pand mm4, e
                psubb mm1, mm4
                movq a, mm1  ; a ← result
                }


                a, b が、上位4ビットに3が入っている形式の場合には c の値を修正するだけでOKのはずです。
                また、a - b をするには、b = f - b を計算してから加算すればOKかな…?
                因みにキャリーに paddq を使っているので、SSE2 以降ですね、このコードだと。

                親コメント
              • 訂正

                >また、a - b をするには、b = f - b を計算してから加算すればOKかな…?

                b = 0x090909090909090A - b が正解かな?(汗
                ま、いないとは思いますが、使う場合には自己責任でちゃんと動作チェックを…(^^;;;

                親コメント
          • 確信犯 (スコア:1, 参考になる)

            by Anonymous Coward on 2008年09月09日 15時17分 (#1418017)

            [Anonymous@Coward ~] $ awk -W version
            GNU Awk 3.1.3
            (snip)
            [Anonymous@Coward ~] $ awk 'BEGIN{x=0;for(i=0;i<10000;i++){x+=0.1}print x}'
            1000
            それが何か?

            おまけ

            [Anonymous@Coward ~] $ php -r '$x=0;for($i=0;$i<10000;$i++){$x+=0.1;};echo $x;'
            1000.0000000002
            親コメント
            • by Anonymous Coward

              [Anonymous@Coward ~] $ awk 'BEGIN{x=0;for(i=0;i&lt;10000;i++){x+=0.1}print x}'
              1000
              それが何か?

              $ awk 'BEGIN{x=0;for(i=0;i&lt;10000;i++){x+=0.1}printf("%.16g", x)}'
              1000.000000000159
              PHPと同じだね。当然ながら。
              • by Anonymous Coward
                た、種明かししないで…
            • by Anonymous Coward
              VBSで書いてみた

              for i=1 to 10000
                      temp = temp + 0.1
              next
              wscript.echo temp

              C:\Documents and Settings\Anonymous_Coward\デスクトップ>cscript /nologo 10000.vbs
              1000.00000000016
          • by T.Sawamoto (4142) on 2008年09月09日 16時58分 (#1418087)
            $ cat a.py
            from decimal import *
            print sum(Decimal('0.1') for i in xrange(10000))

            $ python a.py
            1000.0
            親コメント
          • by nim (10479) on 2008年09月09日 17時18分 (#1418118)
            Java なら十進計算は java.math.BigDecimal 使うでしょうから、
            普通に1000になりますが。
            親コメント
          • by t_mrc-ct (5292) on 2008年09月10日 2時21分 (#1418441) 日記
            では最も手近な日本語で、

            問: リンゴが0.1個入った袋が全部で10000個あります。リンゴは全部で何個分あるでしょうか。
            答: 1000個分

            余裕です。

            問: 猫が0.1匹入った袋が全部で10000個あります。猫は全部で何匹分あるでしょうか。
            答: 1000匹ぶ……、いや待てよ。袋の中身が首ばっかりなら10000びk…、うわぁああああ。

            感情に流されず淡々と仕事をこなす。COBOLはやっぱりすげえや。
            親コメント
          • by njt (4968) on 2008年10月09日 13時36分 (#1434839) 日記

            $ i=0; sum=0; while [ $i -lt 10000 ]; do sum=`expr $sum + 0.1`; i=`expr $i + 1`; done; echo $sum
            しくしく。expr は小数を受け付けてくれなかった。
            # 本当に実行すると10000行エラーが出るので注意。自分はループ10回で構文チェックしました。
            しょうがないので man dc して dc を使おう。

            $ date; i=0; sum=0; while [ $i -lt 10000 ]; do sum=`dc -e "$sum 0.1 + p"`; i=`expr $i + 1`; done; echo $sum; date
            Thu Oct  9 13:29:01 JST 2008
            1000.0
            Thu Oct  9 13:32:12 JST 2008
            うう、夢幻ループになったかと思った。これ、有効数字が小数第1位までだから正しく見えるのかな?
            親コメント
          • by Anonymous Coward
            ではあたくしがかつて作りましたC++/Javaの有理数クラスで…。
          • by Anonymous Coward
            こうですか?
            ちゃんと1000になります(><

            Private Sub Form_Load()

                    d@ = 0@

                    For i = 1 To 10000
                            d@ = d@ + 0.1@
                    Next

                    Debug.Print d@

            End Sub

            # いや、冗談ですよ?
          • by Anonymous Coward
            足してみた.
            % cat a.rb
            require 'bigdecimal'
            a = BigDecimal("0.1")
            sum = BigDecimal("0")
            10000.times(){ sum += a; }
            puts sum.to_i

            % ruby a.rb
            1000

            # 次はどの言語だ?
          • by Anonymous Coward
            Hugs> sum (take 10000 [0.1, 0.1..])
            1000.00000000016
            • by Anonymous Coward
              Prelude Data.Fixed> sum $ take 10000 $ repeat (0.1::Fixed E6)
              1000.000000

        • by Anonymous Coward
          確かに機械にはありがたみがないでしょうが、扱う人間がありがたいと思っている方が重要ではないでしょうか。
        • by Anonymous Coward
          BCD演算ができないCPUってあるんですか?
        • by Anonymous Coward
          金計算は根本的に十進な訳だが。
          それらのハードウェアに合わせてCOBOLが実装されたのではなく、それらのハードウェアとCOBOLは同じ目的を持ってデザインされたんだよ。

物事のやり方は一つではない -- Perlな人

処理中...