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

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

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

    by Anonymous Coward

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

    • by Anonymous Coward

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

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

      • by nekojara (39813) on 2015年06月22日 13時33分 (#2835006)
        上流処理でデータエラーのチェックを行っていることが前提であれば、下流の個々の処理でテストしないことは必ずしも誤った考え方ではありません。

        0がデータエラーでない限りありえないということであれば、データチェックのバグと考えるのが普通で、そのバグの回避を下流の処理で行わせなければならないようなシステムの方こそ品質に問題があります。

        上流処理にデータチェック処理が存在しないということであれば、それはまた別の意味で問題ですが…。
        親コメント
        • by Anonymous Coward

          入力値のダイナミックレンジが大きすぎて、入力を制限できない場合はありますよ。
          レジスタ幅で表現できるダイナミックレンジぎりぎりとか、
          時にはそれをを上回る計算をさせるようなときに、(当然精度は落ちる)
          逆数を求めると値が小さすぎて0になってしまって、それで除算するとエラーとか。

          式の項数が少ないうちは入力を制限できますけど、
          計算式の項が10項を超える方程式とかを解かせる様な場合に、
          入力から出力が0になる事を予想する事が困難、
          または入力をチェックするよりも実際に計算させてみる方が速いな事もありえます。

          • by Anonymous Coward

            その例だと桁落ちを放っておくのがまずいだけでは?

            • by Anonymous Coward

              桁落ちに対応する為に、レジスタ幅を超える演算をメモリと対話しながら行うと、
              計算速度が低下してしまうのが問題で、それは許容できない場合です。

              • by Anonymous Coward

                そりゃアルゴリズムの実装の問題だろう
                処理系の仕様を熟知していなければならないのは当然の話
                確認的動作させなきゃわからない、という状況なら
                処理系に実装されている例外処理を使うべきかもしれない
                すべからく実装コストと実行コストのバランスで
                プログラマが「判ってない」ってのは笑止、っていう話だが
                このトピでもそういう状況なのを云っているのを散見する

              • by Anonymous Coward

                計算速度的にチェックルーチンの追加が許容できないとき、
                #2835055でいうところの事前チェックでゼロ除算エラーが
                発生したらどうするの?

              • by Anonymous Coward

                しょぼい一般論しか話せないお前のような「わかってない」半可通は黙れよ。

              • by Anonymous Coward

                ×すべからく

              • by Anonymous Coward

                その際の動作は、プログラムに要求されている仕様によるんじゃないでしょうか。
                仕様が定義されていなければ、案件として上にあげて、仕様を決めてもらったらいいと思います。

              • by Anonymous Coward

                仕様を決めても計算量が増えたら間に合わないらしいから
                速いCPUを持ってくるしかないんじゃないかな。

                さもなければ誤差だらけかもしれない演算結果を受入れ、
                本番でゼロ除算が起こったら素直に諦める。

              • by Anonymous Coward

                前提条件で対応が変わるものに、
                前提条件を定めないまま、結論を出してもしょーがないと思います。

        • by Anonymous Coward

          大手SIerが人足かき集めて作った大規模基幹システムなんてザルなのが当たり前だと思ってました。
          変なデータがくるんだけどって問い合わせたら、
          今さら変えられないから受信側でチェックしろってところまでがテンプレでしょ?

        • by Anonymous Coward

          それ根本的に間違ってるよ。おもしろ狙いじゃなくて本気で言ってるの?
          あり得ないことが起きるのが現場なんだよ。あり得ないことがあり得てないことをチェックしろよ
          なんでそういうあり得ないからあり得ないのでチェックしないみたいな思考するかな

          • by Anonymous Coward

            たぶん着目点・立ち位置のちがいだと思いますけど。

            ただ、このスレッドの流れは
            >業務計算のプログラムとか除算の嵐です。
            からきてると考えると、チェックするのが妥当だと感じてます。

            #これってサニタイジングの一種ですよね。
            #サニタイジング言うなってそりゃ荒れるわ。。

          • by Anonymous Coward

            いやさ、
            「あり得ないもの」を「正常に処理しなきゃいけない」っていう動機が無いわけよ。
            「あり得ないもの」が「ある」時点で、どう取り繕おうが「終わってる」のには変わりないわけよ。

            それを顕在化させるか、既に意味のないものだから無視するかというケースはそれぞれにあるわけで
            普遍的な正解があるわけではない。

            業務系で言うなら、
            「割り勘処理に人数0人の例外処理をホントに仕様化する必要あるの?」
            って話だから。

            チェックするのが正しいけど、チェックする事に何の意味もないし、チェックしなくて困る奴もいない。

            • by Anonymous Coward

              >チェックするのが正しいけど、チェックする事に何の意味もないし、チェックしなくて困る奴もいない。

              ただ、実際問題として全部一人で見切れるボリュームならよいけど、
              かき集められた元うどん職人とかが書いたコードとかから
              いきなり0とか投げつけられることもあるわけで。

              よたよた進んで密かに計算間違うぐらいなら、盛大に「エラーです」と止まってくれた方がよいし、
              自分の責任では無いと表明できるのです。

              これは仕様の綺麗さとか、ポリシーとかではなくて、単に保身・保険の問題です。

日本発のオープンソースソフトウェアは42件 -- ある官僚

処理中...