パスワードを忘れた? アカウント作成
12187100 story
プログラミング

ゼロ除算発生時にデフォルトの値を返すようにしたら、深刻な問題が発生する? 199

ストーリー by headless
除算 部門より
プログラムでゼロ除算が発生したときに、何らかのデフォルト値を返すようにすることは有害かどうか、というAsk Slashdot記事に1,000件以上のコメントが付き、大いに盛り上がっているようだ。

話としては、ゼロ除算のチェックに疲れ果てたベテランプログラマーが、ゼロ除算発生時に「0」を返すなどの処理をシステム全体のデフォルトとして設定することを夢見るというもの。0以外ではどのような値がゼロ除算の結果として適切か、とも尋ねている。皆さんのご意見はいかがだろうか。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2015年06月21日 19時52分 (#2834671)

    > ゼロ除算発生時に「0」を返す

    「9÷0=」の答えは? 小学校算数で出題された問題めぐりネット上で議論
    2012年11月28日(水) 18時46分
    http://www.rbbtoday.com/article/2012/11/28/98481.html [rbbtoday.com]

    • by Anonymous Coward on 2015年06月21日 20時57分 (#2834711)

      > 一部の世界では正しい

      正しいなんて書いてないです。
      「9÷0=0」と教えている小学校もあると書いてあるだけです。

      親コメント
      • 数学は公理で体系が決まるので、公理として「0で除算した結果は0」と決めれば正しくなる。
        その上で、「0で除算した場合は除算記号の除去を認めない」も公理として追加すれば、一応体系は成立するかと。

        --
        -- Buy It When You Found It --
        親コメント
        • 0で割ると0だけど0/0は定義できない、他はそのままって公理系を定義しようとしているんでしょうけど、well-definedにはできないと思いますよ。a,bを不定定数として、
          ax = b
          x = b / a
          これはaが0の場合は最初の式が0=bになってしまい成り立たないけど
          下の式は x=0になって普通に解が得られてしまう。つまり下の式への変形はa=0を最初に除外しないといけない。しかもa=0だと解無しのまま。せっかく0の除算を定義したのに。
          解の公式もそうだし、他でも色々矛盾が出てきますよ。

          親コメント
          • 上の式を下の式に変形する際に、「除算記号の除去」が行われていますよね。
            a=0の場合、これが禁止されるので、上の式と下の式は等価ではないって事で、一応辻褄は合ってる様な気がします。
            尤も、既存の公式が崩壊するという点では同意します。

            ま、「記号の除去の禁止」が凶悪な足枷となって、二重否定の除去を禁止する直感論理の様な弱い体系になるのは確実なんですが。

            --
            -- Buy It When You Found It --
            親コメント
      • >「9÷0=0」と教えている小学校もあると書いてあるだけです。

        ・・・と教えている「小学校教員もいる」・・・

        が正解なんでしょうね。

        その教員が小学校~教員に至るまでの過程できちんとした算数・数学の教育を受けられなかったか誤った知識のままで、教え子達にもその誤った知識を拡散していってるんだろうなぁ。
        #なんとなく、悪貨は良貨を駆逐する

        親コメント
    • 今時の小学校ではそんな無謀な事を教えてるんですね。
      うちらのころは、のらりくらりと興味を持たないように教えてたかなぁ。
      中学校になって止めろと教わったっけか。
      親コメント
      • by Anonymous Coward on 2015年06月22日 8時16分 (#2834839)

        > うちらのころは、のらりくらりと興味を持たないように教えてたかなぁ。

        30年前小学校で
        「10個のりんごを10人で分けたら、1人1個ですね」
        けど
        「10個のりんごを0人で分けれないし、1人の個数の答え出ないですね」
        って教えてました。

        親コメント
    • by Anonymous Coward on 2015年06月22日 10時07分 (#2834893)

      Android4.4.2の電卓でゼロ除算は「∞」になりますね
      他のバージョンやiOSはわかりませんが

      親コメント
    • by Anonymous Coward on 2015年06月22日 12時13分 (#2834959)

      子供が9÷0を0と習ってきました。
      去年の話です。
      子供には、即座に間違いを指摘しましたが、

      上の子2人に確認したところ、違う先生から0と教わってきていました・・・レベルが低すぎる

      親コメント
  • 割り算させない (スコア:5, 参考になる)

    by Anonymous Coward on 2015年06月21日 23時40分 (#2834773)

    リアルタイム信号処理のプログラム書きますが、
    立ち上がってすぐは入力データが用意されていないでクリアしたバッファの初期値で演算
    (たとえばパイプラインADCとか使っていて入力に遅延がある)
    なんてことは普通にあり得るので、アルゴリズム中に割り算があるとき
    (正規化とかAGCとか)では 0割が発生しないように 除数がゼロかどうか
    あらかじめチェックします。そして、結果を後段アルゴリズムの制約上問題ない値とします。
    例外なんて起こさない方がいいし、誰か書いていましたがそんな機構は無い場合もあるしで
    予測される例外は基本的に排除(生起しないように手を打つ)すべきです。
    データが用意されるまで待てばいいんだけどね。
    演算側の水際でも処置しておかないと安心できない
    つーか、後段の用途によって0割の結果値を吟味するのって普通だと思いますが
    (0で駄目なら非0の微小値とかそもそものアルゴリズムをスキップするとか)
    そういうこと考えないでプログラム書いてるんですかね。

    • by Anonymous Coward on 2015年06月22日 1時05分 (#2834802)

      業務計算のプログラムとか除算の嵐です。
      しかも本来そこに、データエラーでない限り、0はありえないという場合も多い。
      ありえないので処理しない、テストもしないというわけ。

      で、データエラーというのは頻繁に起こるわけです(爆笑)
      笑ってる場合ではないですが。

      親コメント
      • >しかも本来そこに、データエラーでない限り、0はありえないという場合も多い。
        >ありえないので処理しない、テストもしないというわけ。

        みずほ銀行の問題が未だに収拾ついていないらしいのって、こういう文化圏の人が仕切ってるからじゃないかという気がしてならないのですが(^_^;
        まぁ、そういう文化圏の会社の仕事やったことあったから書いてるのですが(;´Д`)

        親コメント
  • なんで誰も気づかない (スコア:4, おもしろおかしい)

    by jpgr (27776) on 2015年06月21日 23時19分 (#2834769)

    チャック・ノリス [wikipedia.org]に答を聞けばいいだろうに。

  • その人が作ろうとしてるプログラムにおいて、0除算が発生した時に、どう云う動作をするのが「正しい」の??
    話は、それからだ。

    • まさにこれ。
      ゼロで除算した結果をどう扱いたいかなんて、完全にドメイン依存だと思うんだがなー。

      チェックコードに忙殺されて主題に集中できない言語・環境に疲れ果てている、という状況には同情する。

      親コメント
    • by Anonymous Coward on 2015年06月22日 9時33分 (#2834866)

      どういう振る舞いが正しいにせよ、割り算するたびにチェックするのは疲れるから、ゼロ除算発生時の振る舞いをオーバーライドできるといいなあという話だと思います。

      デフォルトの振る舞いはエラー終了でいいと思いますけど。

      親コメント
  • by das (2409) on 2015年06月22日 4時18分 (#2834821)
    画像処理では最大値にしてた。
    0だと目に見えておかしくなると思う。
    そういうのがGIMPでもあったので一律0は広めてほしくない。
  • by ymasa (31598) on 2015年06月21日 19時22分 (#2834663) 日記

    > ゼロ除算発生時に「0」を返す

    よりもバリデーションでゼロ除算を発生させない方向には向かえないんですかね?

  • 仕様通りに動いてないから遭遇する状況だと思うが、
    それを「よくわからないから」という理由で「無かった」ことにするのが正しいか、
    と言ってるの?正気ですか?

    #真面目に言ってるとしたら、馬鹿の戯言
  • ベテランプログラマー氏の言いたかったことは「プログラムの仕様からして値がゼロの場合はありえない。なのに毎回チェックしろと上司がうるさくて・・・」ということなのでは?
  • by Anonymous Coward on 2015年06月21日 19時52分 (#2834672)

    ゼロ除算の結果は未定義だから、例外投げて死のうが何らかのデフォルト値を返そうがコンピューターが爆発しようが任意コードが実行されようが鼻から悪魔が出ようが仕様上は何の問題もない。チェックが不要になるわけではないが。むしろ例外が投げられると期待してチェックをサボってはいけない(実際にx86に慣れたプログラマーがARMデバイスでよく踏む罠)。

    • by Anonymous Crow (45505) on 2015年06月22日 9時36分 (#2834869)
      MIPS も0除算例外出さないです
      なので、アセンブラレベルで0除算か検査して例外出すように変換しています

      逆に、符号付整数加算はオーバフロー例外投げることがありますので、
      通常は符号なし整数加算に変換されます

      アセンブラでコーディングすることを「ほぼ」前提としないMIPSならではの仕様はこのほかにもあります
      親コメント
  • by Anonymous Coward on 2015年06月21日 20時00分 (#2834677)

    浮動小数点数演算ではそうなってるよね
    こないだ余所の会社が作ったツールを改造してたときに露骨にゼロ除算例外が出ることを期待してたコードになっててバグの原因の一つになってた

  • 実数体ではすべての元が除算の答えとなりえるから、
    デフォルトで実数体の何かの元をゼロ除算の結果として返すと
    その値は元としての意味とゼロ除算としての意味を二つ重ねて持つ。
    その二つを使い分ける必要があるときに分けられれば問題ないが、
    結局その手間は、ゼロ除算時のエラーチェックと大差ないと思う。

  • by Anonymous Coward on 2015年06月21日 21時44分 (#2834725)

    せっかくだから ㊙ を……

    // やったら呆れられた

    • by minet (45149) on 2015年06月22日 7時53分 (#2834832) 日記

      n/0を処理するとマル秘が返るんですか?
      それは興味深い処理系ですね。

      事務用システムの開発で簡易コンパイラやインタプリタを作って、ゼロ除算したらハイフンとか"入力なし"とか文字列を返す処理系ってのは作ったことがありますが、そういう系でしょうか。

      親コメント
      • by Anonymous Coward on 2015年06月22日 9時41分 (#2834872)

        ええ、文字列を返す処理を挟んだだけです。
        ちょっとだけ頑張ったのはエラーも含め、㊙_イ、㊙_ロ、㊙_ハとナンバリングし直し文字列を返した理由と「もしかして?」をポップアップするようにした点ですね。難しいことはしていないのですが、あれこれ手間暇かけました。今でも某社某部で動いています。

        親コメント
  • ÷や/のボタンを押すと、1~9の数字を入れない限り、0を入力できないようにするという感じで。
    --
     /\ /\ /\
    (・大・  )3
    ___/\___________________
    Jody Wisternoffこそ至高。
    - Tetsuya Hiragino
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...