dポイントプレゼントキャンペーン実施中!

a=a*b
という計算で、aが無限大、bがゼロ(整数)という処理をしました。右辺のaが無限大となることが分かっているので、それをマスクするためにゼロであるbをかけてマスクするという処理を考えたわけです。
しかし、値を書き出してみると、aは無限大(NaN)のままであり、bはゼロです。
処理系もいろいろと思いますが、私はintelのPCにintel fortranを使っています。プログラム上、無限大が発生するだろうことはわかっており、それにゼロをかけて穏便に済ませるというつもりだったのですが。そもそも無限大を発生させることを避けて方がいいのでしょうか。

よろしくお願いします。

A 回答 (3件)

> x=0.0


> y=0.0
> a=1./x
> write(*,*) a,a*y,x
> stop; end
> を計算すると、Infinity, 0.0, 0.0となりました。
確かにこれは変ですね。コンパイラが変な最適化をして、a*yをゼロにしてしまっているのかも。
x,yをファイルから読み込むようなコードにするとどうなるか気になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
アルゴリズム的にはif文などを使うよりもこのようにした方が読みやすくスマートかなと思ったのですが、処理系の考え方を合わなかったようです。
if文があるとスレッドが分岐するのでプログラムが読みにくくなるなあといつも思っています。

お礼日時:2016/01/31 16:34

ISO/IEC/IEEE 60559 (いわゆる IEEE 754) によれば, ∞×0 は (しかるべき符号を持った) NaN とするのが適切です. ただし, プログラム言語によっては「ISO 60559 の規定に正確には従わない」こともあって, その場合には「どうなるかわからない」と解すべきでしょう.



つまり, 「∞ の値は 0 としたい」というのであれば, 素直に 0 を代入するのがベストです.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。そういうことにしたいと思います。

お礼日時:2016/01/31 16:31

NaNは非数で無限大じゃありませんよ。

無限大×ゼロが不定だから非数を返しているんでしょう。
それで、あなたはどういう結果を期待しているのですか。
ゼロになることを期待しているなら単にa=0と代入すれば良いわけですが・・・
ゼロでない有限の値、例えば1を期待するならそれを代入すれば良いわけですし。
それらではなく何か有用な有限値が得られることを期待しているとすれば、無理ですと言わざるを得ないですね。
いったん無限大になると後は有用な数値が得られることは期待できません。
無限大を避けて計算できるならそのように修正してください。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。ゼロを期待してゼロをかけたわけですが、無限大×ゼロが不定、あるいはゼロ÷ゼロが不定ということですね。
簡単な例ですが、
x=0.0
y=0.0
a=1./x
write(*,*) a,a*y,x
stop; end
を計算すると、Infinity, 0.0, 0.0となりました。
aが無限大、a*yがNaN, ということであれば予定通りかなと思うのですが、ここは無限×ゼロがゼロになっています。
この問題は、アルゴリズムに関して例外処理を明確にしなくてもいい(緩いアルゴリズムでもいい)ところであり、計算結果がほしいところではありません(計算領域の中で捨てる領域)。なので、ゼロを出してもらえればよかったのですが。そこまで神経を使わないといけないようですね。

お礼日時:2016/01/26 23:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!