#include<stdio.h>
#include<math.h>
main()
{
double y;
y=log(0);
printf("%lf",y);
return 0;
}
上のプログラムを実行すると
-1.#INF00P
という結果が出力されます。
これは一体何なのでしょうか?値なのですか?
http://www.okweb.ne.jp/kotaeru.php3?q=648430
ではlog(0)の影響で
1.#INF00
という結果になっているようですが、何が違うのでしょうか?
No.3ベストアンサー
- 回答日時:
>INFOOの後ろのOOがよく分からないですが…。
今BCC32でコンパイルしたところ"-INF"という表記でした
00は恐らく∞を、0を繋げて表現しているのだと思います。
ところでy = 1 / 0と y = 1.0 / 0.0では意味も結果も違います。
前者は1÷0をint型で行った後にdoubleにキャスト(変換)します。
結果1.0になります。
後者はdoubleで計算を行い結果がINFになります。
0で除算しようとして
Unix系やWindowsの場合だと、実行中にエラーを返すことはありません。
コンパイラによってはErrorではなくWaningがでますが。
Errorがでるなら計算前に分母をチェックする必要がありますね。
>10の19乗は大丈夫ですが
>10の20乗はエラーになりました。
Rossanaさんは型について意識しているでしょうか?
doubleの有効数字はせいぜい16桁です。
それと
y=exp(10000000000000000000);とした場合コンパイラは
まず10000000000000000000をint型として認識しようとます。
10000000000000000000.0としてください。
それでも駄目なら1E+20としてください。
それでエラーは無くなると思います。
ちなみにBCC32では「10000000000000000000」でも問題ありませんでした。
#コンパイラは何を使っているのかと
#OSの種類を書いたほうが適切なアドバイスが受けやすいかと思います。
この回答への補足
>0で除算しようとして
>Unix系やWindowsの場合だと、実行中にエラーを返すことはありません。
でも僕のパソコンでは0で除算するとエラーになります。
>Rossanaさんは型について意識しているでしょうか?
>doubleの有効数字はせいぜい16桁です。
型を意識するようにこれから気をつけようと思います。
doubleの有効数字って具体的にはどういうことですか??
sha-girlさんの言う通り
y=exp(100000000000000000000.0);やy=exp(1E+20);
→1.#INFOO
の結果がでました。
アドバイスありがとうございます。
>00は恐らく∞を、0を繋げて表現している
なるほど~そうっぽい感じですね。
>前者は1÷0をint型で行った後にdoubleにキャスト(変
>換)します。
>結果1.0になります。
>後者はdoubleで計算を行い結果がINFになります。
なぜ前者の結果は1を0で割っているのに1.0になるのですか?
BCC32ではINFの表示なのですね。
#コンパイラはVisual C++ 6.0
#OSはWindowsXP
です.
No.4
- 回答日時:
>doubleの有効数字って具体的にはどういうことですか??
これは浮動小数点について知れば理解できます。
最初に書いたURLにも説明がでていますが浮動小数点は
符号、指数部、仮数部の情報が入っており
double(8バイト)の中にその情報を押し込めています。
情報量はたかだか8バイトなのですから有効数字にも限界もあるわけです。
浮動小数点についてはこちらのURLの方がわかりやすいかもしれません。
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …
>なぜ前者の結果は1を0で割っているのに1.0になるのですか?
理由については「ビット演算」を知る必要があります。
コンピュータは二進数で処理しますが
掛け算の場合
5 * 2 = ?
5は2進数で 101ですがこれを2倍するというのは左に1個ビットをずらす
ことなのです。
左にずらすと1010となり10進数では10になります。
逆に2で割るというのは右にずらします。
で1ならそのままで、0の場合どうなるかですが
この定義がされているかどうかは分かりませんが
BCC32の場合は、なにもせず1になります。
回答ありがとうございました。
>ところでy = 1 / 0と y = 1.0 / 0.0では意味も結果も>違います。
>前者は1÷0をint型で行った後にdoubleにキャスト(変換)します。
>結果1.0になります。
>後者はdoubleで計算を行い結果がINFになります。
まとめると1(1.0)を0(0.0)で割ると,
BCC32ではそのような結果になるけれど,VisualC++ではエラーになるということでいいでしょうか?
No.2
- 回答日時:
-1.#INF00Pは「やたら小さい数」という値です。
「2.7182のX乗=0の時のXは?」という計算をやらせたようなもので、グラフなどを描くと分かりますが、
X= 1:2.7182
X= 0:1
X=-1:0.3679
X=-2:0.1353
・
・
とXが小さくなるほど、0に近づきます。
一応は数値なので、計算や比較が可能です。
double型の値に関しては、IEEE754という規定でそのフォーマット、値の意味が定められています。(厳密にではないところがミソですが…)
--
> 1.#INF00
こちらは符号が正です。
1.0/0.0=
のような計算を行うと出る事があります。
0割りで停止する処理系なんかもあったハズですが。
この回答への補足
みなさんにお詫びしなくてはなりません。
-1.#INF00Press any key to continue
と結果表示されたため,誤認しました。正しくは
-1.#INFOO
でした。訂正お願いしますm(__)m
◇追加実験結果
y=exp(10000000000000000000);
→1.#INFOO なるほど∞ですね。
y=exp(100000000000000000000);
→定数が大きすぎます。
10の19乗は大丈夫ですが
10の20乗はエラーになりました。
この扱える値の境界も決まっている事でしょうか?
回答ありがとうございます。
>「2.7182のX乗=0の時のXは?」という計算をやら
>せたようなもので、グラフなどを描くと分かります
>が、
実験してみました。yを次のように変更すると
●y=exp(-1000000000000000000);
→0.000000
●y=exp(-10000000000000000000);
→1.#INF00(なんで∞なの!?)
●y=exp(-100000000000000000000);
→定数が大きすぎます。というエラー。
>一応は数値なので、計算や比較が可能です。
なるほど数値とみなせるんですね!!
>1.0/0.0=
>のような計算を行うと出る事があります。
>
>0割りで停止する処理系なんかもあったハズですが。
>0割りで停止する処理系なんかもあったハズですが。
まさに僕の環境ではy=1.0/0.0に変更すると
「除算、剰余演算が 0 で行われています。」
という実行エラーになりました。
No.1
- 回答日時:
-1.#INF00Pはマイナス無限大を表します。
コンパイラによっては-INF等となったり
かならずしも表記が決まってはいないようです。
-0.0で除算しても同じ結果になると思います。
doubleは倍精度浮動小数点ですが
以下のサイトが参考になるかと思います
IEEE形式浮動小数点について
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFo …
この回答への補足
みなさんにお詫びしなくてはなりません。
-1.#INF00Press any key to continue
と結果表示されたため,誤認しました。正しくは
-1.#INFOO
でした。訂正お願いしますm(__)m
回答ありがとうございます。-∞なのですね。
おそらくINFINITYの略なのでしょうかね。INFOOの後ろのOOがよく分からないですが…。
表記は決まってないのですね。
>-0.0で除算しても同じ結果になると思います。
実験してみました。
y=-1/0に変更
→除算、剰余演算が 0 で行われています。というエラーになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
difftime()について
-
C 開放してるのにエラー(doubl...
-
C言語で
-
2分法で方程式の複数の解を自...
-
2次方程式の解を求めるプログ...
-
sin(x)の近似について
-
テイラー展開(C言語)
-
至急です! マクロ定義で #defi...
-
C言語でポインタを用いた平均,...
-
c言語 標準体重計算のプログラ...
-
ガウスの掃き出し法によるC++プ...
-
C言語でdouble型の小数点の引き...
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
Complex.h
-
指数の表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
doubleは常に%lfとするべきなのか
-
Cで3乗根を求める方法
-
-1.#IND00と出てしまうのですが...
-
C言語で-23乗を取り扱うには
-
C++で外積
-
2次方程式の解を求めるプログ...
-
方程式を2分法を用いて解くプロ...
-
ニュートン法
-
c言語のコンパイルエラー canno...
-
difftime()について
おすすめ情報