a=a*b
という計算で、aが無限大、bがゼロ(整数)という処理をしました。右辺のaが無限大となることが分かっているので、それをマスクするためにゼロであるbをかけてマスクするという処理を考えたわけです。
しかし、値を書き出してみると、aは無限大(NaN)のままであり、bはゼロです。
処理系もいろいろと思いますが、私はintelのPCにintel fortranを使っています。プログラム上、無限大が発生するだろうことはわかっており、それにゼロをかけて穏便に済ませるというつもりだったのですが。そもそも無限大を発生させることを避けて方がいいのでしょうか。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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をファイルから読み込むようなコードにするとどうなるか気になります。
回答ありがとうございます。
アルゴリズム的にはif文などを使うよりもこのようにした方が読みやすくスマートかなと思ったのですが、処理系の考え方を合わなかったようです。
if文があるとスレッドが分岐するのでプログラムが読みにくくなるなあといつも思っています。
No.2
- 回答日時:
ISO/IEC/IEEE 60559 (いわゆる IEEE 754) によれば, ∞×0 は (しかるべき符号を持った) NaN とするのが適切です. ただし, プログラム言語によっては「ISO 60559 の規定に正確には従わない」こともあって, その場合には「どうなるかわからない」と解すべきでしょう.
つまり, 「∞ の値は 0 としたい」というのであれば, 素直に 0 を代入するのがベストです.
No.1
- 回答日時:
NaNは非数で無限大じゃありませんよ。
無限大×ゼロが不定だから非数を返しているんでしょう。それで、あなたはどういう結果を期待しているのですか。
ゼロになることを期待しているなら単にa=0と代入すれば良いわけですが・・・
ゼロでない有限の値、例えば1を期待するならそれを代入すれば良いわけですし。
それらではなく何か有用な有限値が得られることを期待しているとすれば、無理ですと言わざるを得ないですね。
いったん無限大になると後は有用な数値が得られることは期待できません。
無限大を避けて計算できるならそのように修正してください。
早速の回答ありがとうございます。ゼロを期待してゼロをかけたわけですが、無限大×ゼロが不定、あるいはゼロ÷ゼロが不定ということですね。
簡単な例ですが、
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, ということであれば予定通りかなと思うのですが、ここは無限×ゼロがゼロになっています。
この問題は、アルゴリズムに関して例外処理を明確にしなくてもいい(緩いアルゴリズムでもいい)ところであり、計算結果がほしいところではありません(計算領域の中で捨てる領域)。なので、ゼロを出してもらえればよかったのですが。そこまで神経を使わないといけないようですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード PコアとEコアの使い分け 3 2023/07/30 22:09
- CPU・メモリ・マザーボード DELL Vostro 3268に付けられるCPUを教えてください。以下にspecを載せてます。 4 2022/10/24 11:19
- 物理学 シミュレーション仮説は本当か? 6 2023/06/25 20:26
- 画像編集・動画編集・音楽編集 Freemake Video Converter の無料版のVer はどれでしょうか? 1 2023/08/06 11:56
- 数学 『数は実在するのか』 6 2023/06/04 15:15
- ダイエット・食事制限 調味料のカロリー 1 2022/05/25 09:02
- 数学 『無限回の計算』 4 2023/06/07 17:49
- 大学院 修士論文の過ちを報告した際 2 2023/03/30 20:55
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Excel(エクセル) 何故割り算なのでしょうか? 6 2022/11/09 13:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
-
EXCEL/VBA 変数の値をクリップ...
-
java final
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
C++における関数の引数について...
-
数値計算??
-
切り上げ
-
Variant型で宣言してるのにEmpt...
-
親ウィンドウの情報をインライ...
-
C言語 アロー演算子について質...
-
整数xxxが大き過ぎますというエ...
-
Serialize(CArchive& ar)にて
-
変数にオフセットが付いている...
-
擬似コントロール配列への代入
-
コピー代入演算子と代入演算子...
-
VB6.0での条件文にある#の意味
-
ExcelのVBAでをA列に第0〜19項...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
EXCEL/VBA 変数の値をクリップ...
-
だれがとけるの?
-
C言語 列挙型(enum型)変数について
-
[VBS]変数を定数に変換する方法...
-
jsp~jspにhiddenを使って変数...
-
Variant型で宣言してるのにEmpt...
-
processing エラーで、 "cannot...
-
テキストボックスの値を変数に...
-
整数xxxが大き過ぎますというエ...
-
C言語 アロー演算子について質...
-
i++と++i ってどう違うのですか?
-
数値計算??
-
python の 連鎖代入の文法
-
インクリメント演算子の前置(+...
-
「%」を使って、偶数か奇数かを...
-
【VBA】複合代入演算子
-
VBA 1行で複数の代入を行った...
-
datagridviewに行...
おすすめ情報