#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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C言語を実行すると-infが出てきて困っています。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
math.h等について
-
c言語のコンパイルエラー canno...
-
sin,cos,tanを求めるプログラム...
-
C# 割合の記述について
-
浮動小数点の定数
-
3次元の最短距離計測 MFC...
-
C言語を実行すると-infが出てき...
-
C言語で台形公式を使った二重積...
-
相互相関関数
-
c言語超初心者です。2
-
実数型の変数に値を入力した計...
-
C言語における複素数の四則演算...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
指数形式で入力するには
-
C言語 二分法 プログラム
-
正規分布の乱数生成
-
C言語でポインタを用いた平均,...
-
C#のプログラミングについて(...
-
C言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語でdouble型の小数点の引き...
-
たくさんの数の平均を求める方...
-
斜辺と角度て底辺と高さを出したい
-
C言語で台形公式を使った二重積...
-
float?数字の後にLがつくもの
-
listに構造体を格納
おすすめ情報