
分数の計算で分母がゼロになると当然発散するわけですが、その回避の方法として以下のようなものを考えています。
x=1.0
y=0.0
a=x/y ! a=∞ ゼロ割計算が一旦発生する
b=y/x ! b=0.0
if(y.eq.0.) then
c=a ! しかしここでaを採用しないのでプログラムには関係なし。
else
c=b ! こちらが選択される。
endif
というようなものです。一旦ゼロ割が生じるけれどもそれを採用しないのでトラブル回避という格好です。このような方法は問題ないと考えられるでしょうか。
もちろん、このような簡単なプログラムではありません。複雑なアルゴリズムの中の1つの局面でこのような処理をするということです。それとも絶対このような処理は行うべきではないのでしょうか。
実験すべきかと思いますが、本当の方は複雑なので実験結果があてはまるかどうかも分からないものですので。
よろしくお願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
#3です。
>このプログラムではゼロ割しても後の処理でその問題を回避する処置がなされるため体勢に影響はないという解釈が成り立ちます。
そのような(ゼロで割った時点でエラーが発生しないが、その結果を格納した変数を参照した時点でエラーになる)言語は今のところ実在しないでしょうね。わざとそういう言語を作れば作れますが。
実在する言語では、
ケース1: ゼロで割った時点でエラーになり、プログラムが異常終了する。異常終了を回避できない
ケース2: ゼロで割った時点でエラーになり、割り込みが発生して、あらかじめ指定した処理が動く。特に処理を指定しないとプログラムが異常終了する
ケース3: 演算結果として無限大相当の値を取り、エラーにならず処理続行
のいずれかです。ほとんどの実用言語はケース2だと思います。
ケース3の例としてはRubyですね。Rubyのfloat型は、通常の実数値(Cのdouble)の他にInfinty,-Infinity,NaN(=Not a Number=非数=0.0/0.0) の値も取れ、a=1.0/0.0 だと、a には Infinity が入ります。他にも数学関係の言語でも無限大を扱えると思いますよ。
したがって、
>どんな言語、どんな処理系でもこれが生じたらそのシステムは異常終了するのである
は間違っています。
No.4
- 回答日時:
その考え方だと、分子も0の時には通用しないとおもいますがね。
除数と被除数は両方調べる必要がありますし、実数の除算の場合、アンダーフローやオーバーフローまで含めて考えないと意味がありません。
No.3
- 回答日時:
数学の話じゃなくて、プログラミングの話なら、実数のゼロ除算でどうなるかは言語によって違いますので、特定言語に限定して話さないと意味がないです。
・例外が発生。例外処理を記述できる
・例外が発生。例外処理を記述できない
・結果が浮動小数点の無限大になり、処理続行
などなど
例外が発生するケースでは、a=x/y の時点で発生するので、その後のif文の実行がどうなるかは関係ないです。
回答、有り難うございます。
ご指摘の内容はコンパイラ、処理系、言語など諸々の条件によっていろいろ変わるということかと思います。
このプログラムではゼロ割しても後の処理でその問題を回避する処置がなされるため体勢に影響はないという解釈が成り立ちます。ゼロ割した変数の内容をその後参照しないからですね。コンパイラがそのように判断するというようなことではないかと思います。
一方、その逆の解釈、すなわち、ゼロ割が生じるようなプログラムはそれがどのような局面でさえ、絶対に動作しない、どんな言語、どんな処理系でもこれが生じたらそのシステムは異常終了するのである、というものです。この場合、このアルゴリズムは何が何でも排除しなければならないわけです。
数千行程度のプログラムのバグフィックスをおこなっており、最初の質問に示したような趣旨のアルゴリズムを見つけました。この箇所こそその元凶であると特定したかったのですが、必ずしもそういうことではないということのようですね。もちろん、私がこのアルゴリズムを積極的に採用したいと思っている訳ではありません。私が期待した回答は後者、すなわち絶対回避せよ、なのです。
No.2
- 回答日時:
前出の回答のように除数の0チェックをするのが定石です。
また、被除数、除数が整数の場合は単純な0チェックで良いですが
浮動小数点の場合は、除数の範囲チェックをする方が望ましいです。
範囲の大きさは、プログラムの仕様とか
想定される商の数値から妥当な範囲を決めるしかないでしょう
No.1
- 回答日時:
どんな処理系を想定しているのか不明ですが、
大抵の処理系では0除算を実行すると除算例外またはオーバーフロー例外が発生して処理の継続が出来なくなります。
0除算は実行自体を回避すべきで除算実行前に分母の値をテストするのが普通です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- 統計学 t検定について教えてください 2 2023/02/23 16:35
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- 工学 非言語分野が全くできない人にオススメの参考書を教えてください 1 2023/06/01 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- システム CPUの問題について 2 2022/07/09 12:04
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
数学、プログラミング、物理、...
-
画像生成AIのプロンプトの作り...
-
Python... 環境設定 初心者です...
-
OS入ってる機器のソフト・アプ...
-
pip --versionがエラーになる
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
Webサイト内に埋め込んだmp4動...
-
ExcelVBAでFormulaR1C1を列範囲...
-
Pythonのエラーメッセージをコ...
-
ネットワークフォルダの中身を...
-
Pythonで仮想通貨の自動売買が...
-
AIの登場でプログラマーたちが...
-
Google ColaboでGUI作成
-
Pythonについて。
-
HTMLソースが表示のページのも...
-
MOVEコマンドでサブフォルダー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
CSVファイルの複数行削除
-
OS入ってる機器のソフト・アプ...
-
Python 3.12.2 か一番最新のパ...
-
pythonの実行に関する質問
-
パイソンのソースコードをChatG...
-
画像生成AIのプロンプトの作り...
-
数学、プログラミング、物理、...
-
pip --versionがエラーになる
-
Google ColaboでGUI作成
-
Python... 環境設定 初心者です...
-
HTMLソースが表示のページのも...
-
ネットワークフォルダの中身を...
-
MOVEコマンドでサブフォルダー...
-
google Colabでmatplotlibの描...
-
VBAでパワーシェルを実行したい...
-
Pythonでの文字列からfloatへの...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
pythonについて(初心者です)
おすすめ情報