アカウント名:
パスワード:
その人が作ろうとしてるプログラムにおいて、0除算が発生した時に、どう云う動作をするのが「正しい」の?? 話は、それからだ。
まさにこれ。ゼロで除算した結果をどう扱いたいかなんて、完全にドメイン依存だと思うんだがなー。
チェックコードに忙殺されて主題に集中できない言語・環境に疲れ果てている、という状況には同情する。
どういう振る舞いが正しいにせよ、割り算するたびにチェックするのは疲れるから、ゼロ除算発生時の振る舞いをオーバーライドできるといいなあという話だと思います。
デフォルトの振る舞いはエラー終了でいいと思いますけど。
0除算の次は空文字チェックだのnullチェックだの言いだすだろうけどな。
じゃあPHPを使おう^o^0除算も未定義変数の参照もWarningやNoticeで許してくれる。
#警告メッセージ黙らせる為のイディオム書くの面倒です^p^$hoge = isset($piyo) ? $piyo : '';みたいなやつ
警告メッセージを黙らせるなら式の頭に@をつければいいです。
@(0/0);
とかね。あんまり使わんほうがいいと思うけど。
普通に演算子オーバーロードできる言語でいいのでは。
正しい答えは一つ。ゼロ除算が発生したらエラーアベンド。
プログラムは何も言われなくとも除数が0になった場合の処理があるべきで、仕様にそれがない場合の想定はエラーしかない。
そういえば昔やったことがあるけど、除算などをマクロにするルールにして、そのマクロに除数0なら0を返すという処理を入れればいい。そういうのはローカルルールでやるべきことだ。
計算結果を何に使うかで変わってきますよ。3D空間の座標系計算のような場合は、0が引数に入ってきた場合を始めにトラップして、想定している範囲の最大の数値を返したりとかやりますよ。組み込み系の場合には、自分で仕様書く場合は0が突っ込まれないように回避策を考えたりもしますし、仕様書が上から降ってくる場合には「0で割り算する可能性があるんだけど、その場合どうします?(´・ω・`)」とコードを書いてる時でもお伺いを立てたりもしましたよ。
要は、データ構造を作る段階で、可能ならば、割り算の分母に0が突っ込まれた場合の数値とかトラップ処理とかを入れ込んで考える必要があると言う事で。
エラーでプログラムが異常系に行くとか止まっちゃうとかAssertで強制終了しちゃうというのは、最悪のシナリオだという感覚がどうしてもありますけどね。分母0の割り算でそうなってしまうのは、ヌルポインタでそうなるのと同じ位「ダサい」と言う感覚が。
> ゼロ除算が発生したらエラーアベンド。
アベンドって死語ですよね。今の人には通じない気がするんですが。それに、さすがに、例外ぐらいは放って欲しいですね。Cで書かれたプログラムでも、いきなり abort とか、そういうお行儀の悪いプログラムはさすがに滅んで欲しいです。
やっぱり、「ABEND」 じゃないとわかり辛いですよね。
民○党の人に元の意味といっしょに教えたら喜んで流行らせそう。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
……いや、だから…… (スコア:3)
その人が作ろうとしてるプログラムにおいて、0除算が発生した時に、どう云う動作をするのが「正しい」の??
話は、それからだ。
Re:……いや、だから…… (スコア:1)
まさにこれ。
ゼロで除算した結果をどう扱いたいかなんて、完全にドメイン依存だと思うんだがなー。
チェックコードに忙殺されて主題に集中できない言語・環境に疲れ果てている、という状況には同情する。
Re:……いや、だから…… (スコア:1)
どういう振る舞いが正しいにせよ、割り算するたびにチェックするのは疲れるから、ゼロ除算発生時の振る舞いをオーバーライドできるといいなあという話だと思います。
デフォルトの振る舞いはエラー終了でいいと思いますけど。
Re: (スコア:0)
0除算の次は空文字チェックだのnullチェックだの言いだすだろうけどな。
Re: (スコア:0)
0除算の次は空文字チェックだのnullチェックだの言いだすだろうけどな。
じゃあPHPを使おう^o^
0除算も未定義変数の参照もWarningやNoticeで許してくれる。
#警告メッセージ黙らせる為のイディオム書くの面倒です^p^
$hoge = isset($piyo) ? $piyo : '';
みたいなやつ
Re: (スコア:0)
警告メッセージを黙らせるなら式の頭に@をつければいいです。
@(0/0);
とかね。あんまり使わんほうがいいと思うけど。
Re: (スコア:0)
普通に演算子オーバーロードできる言語でいいのでは。
Re: (スコア:0)
正しい答えは一つ。
ゼロ除算が発生したらエラーアベンド。
プログラムは何も言われなくとも除数が0になった場合の処理があるべきで、
仕様にそれがない場合の想定はエラーしかない。
そういえば昔やったことがあるけど、
除算などをマクロにするルールにして、そのマクロに除数0なら0を返すという処理を入れればいい。
そういうのはローカルルールでやるべきことだ。
Re:……いや、だから…… (スコア:2)
計算結果を何に使うかで変わってきますよ。
3D空間の座標系計算のような場合は、0が引数に入ってきた場合を始めにトラップして、想定している範囲の最大の数値を返したりとかやりますよ。
組み込み系の場合には、自分で仕様書く場合は0が突っ込まれないように回避策を考えたりもしますし、仕様書が上から降ってくる場合には「0で割り算する可能性があるんだけど、その場合どうします?(´・ω・`)」とコードを書いてる時でもお伺いを立てたりもしましたよ。
要は、データ構造を作る段階で、可能ならば、割り算の分母に0が突っ込まれた場合の数値とかトラップ処理とかを入れ込んで考える必要があると言う事で。
エラーでプログラムが異常系に行くとか止まっちゃうとかAssertで強制終了しちゃうというのは、最悪のシナリオだという感覚がどうしてもありますけどね。分母0の割り算でそうなってしまうのは、ヌルポインタでそうなるのと同じ位「ダサい」と言う感覚が。
Re: (スコア:0)
> ゼロ除算が発生したらエラーアベンド。
アベンドって死語ですよね。今の人には通じない気がするんですが。
それに、さすがに、例外ぐらいは放って欲しいですね。Cで書かれたプログラムでも、いきなり abort とか、そういうお行儀の悪いプログラムはさすがに滅んで欲しいです。
Re:……いや、だから…… (スコア:1)
やっぱり、「ABEND」 じゃないとわかり辛いですよね。
Re:……いや、だから…… (スコア:1)
民○党の人に元の意味といっしょに教えたら喜んで流行らせそう。
-- う~ん、バッドノウハウ?