トップページ⇒prog
19コメント6KB

int float

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさんNGNG
int型に0x0x40085921と格納されているのですが、
floatで2.130440だそうです。なんでですか?
さっぱりわかりません。

博識の方、よろしくお願いします。
0002>1NGNG
ここ読んで 難しかったらまた質問しましょう

http://www.hucc.hokudai.ac.jp/html_docs/common-tools/numerical_comp_guide/index.html
00031NGNG
さっぱりわかりません。
初心者には理解できないことなのでしょうか?
0004>1NGNG
博識以前の問題だな。
このボードに来るのは少し早すぎた様な…
00051NGNG
2のリンクを見てみたのですが、さっぱりわからなかったものですから。
どこらへんを読めば理解できますか?
申し訳ありませんが、ご教授願います。
0006AONGNG
なんとなく、floatの前に、intとかがメモリへどう格納されているか、
から始めたほうが言いような気がしますが。。。>1
unsigned intからの方がいいかな?この辺の理解が出来ればすぐだと思います。。。
0007>1NGNG
16進数は分かります?
00081NGNG
16進数は理解してるつもりです。0から始まってfで繰り上がるやつですよね。
0x40085921を10進に直すと1074288929になってしまいますよね。
どちらも同じ数値です。

なぜこれをfloat値に出来るのか、わかんないんです。
さっきからプログラミング言語Cの第2章を見てるのですが、今一つ。。
どの辺を参考にしたら良いでしょうか?
0009名無しさんNGNG
浮動小数点の表現と言うのは、言語に依存したもんじゃないでしょ。
っつーか、実装依存じゃなかったっけ?
0010名無しさんNGNG
intは2の補数表現で格納されてて、
floatはIEEEだったか?で決められている
符号部と指数部と仮数部で格納されているんじゃないでしょうか?
printfでキャストしないで%fにintを与えると可変個引数の宿命が
起こって、そのまま解釈してしまうんだったと思います。
つまり、intの並びを最初の一桁を符号部・・・と言った感じで。
違いました?詳しい人正しいレスプリーズ
0011名無しさんNGNG
16進が分かるなら、2進も分かるでそ。
そしたら、浮動小数点も分かるのでは?
00121NGNG
整数では理解していると思うんですけど、少数はちょっとわかりません。
IEEE(なんと発音するのでしょう?)では、一番左のbit(31bit?)が符号ですよね。
しかし、3f800000が1.0、40000000が2.0になぜなるのか理解できません。
また、これを理解したとして、どのように変換すれば良いのでしょう?
みなさん、質問ばかりでごめんなさい。感謝してます。
よろしくお願いします。
0013>1NGNG
これで判らない?
http://www.reitaku-u.ac.jp/infosci/excel/excel05.html

判らないとすればどこが判らない?
0014名無しさんNGNG
興味があるなら2のリンクをもっと読込んでみたら?
何度か読めば判るよ。

おいらは、FPU持ってないCPUだと対数表現なんて良く使うなあ。
掛算が足し算になって楽。加算もそう難しくない。
が、負数を表現する時は複素数(角度情報)が必要になる。
0015名無しさんNGNG
>IEEE(なんと発音するのでしょう?)
「あいとりぷりいー」と読みます。わたしの周りの人間は
見なそう呼んでいるのでたぶんあっています。

2のリンクはすばらしいですね。ブックマークに入れておきます。

>しかし、3f800000が1.0、40000000が2.0になぜなるのか理解できません。
単精度浮動小数点が符号、指数、仮数の組み合わせになっている
こと、仮数は23bitだが、その上にもう1ビット追加されて(隠し
ビット)実際は24bitであることをまず理解してください。
隠しビットは常に1であることを理解してください。
仮数部の23bitは小数点以下の値であることを理解してください。
指数部は、0が127(01111111)であることを理解してください。

すると、1の時は 1.0×2^0なので、仮数部は0、指数部は127、
符号は0なので
0_01111111_00000000000000000000000=0x3f800000
2の時は1.0×2^1なので、仮数部は0、指数部は128、符号は0なので
0_10000000_00000000000000000000000=0x40000000
となります。

これでどうでしょう。
001615NGNG
「あいとりぷりいー」じゃない。
「あいとりぷるいー」です。ごめんなさい。
00171NGNG
わかりました。
メモリ上にはintもfloatも同じように格納されてるんですね。
だから、memcpyしてあげれば、intからfloat値に変換できるんですね。
IEEEはちょっと、私には敷居が高かったように思いますが、これから
勉強して、理解していきたいと思います。
みなさん、ご親切にありがとうございました。
0018ミザールNGNG
>メモリ上にはintもfloatも同じように格納されてるんですね。
>だから、memcpyしてあげれば、intからfloat値に変換できるんですね。
それはかなりまずいです。

おおざっぱに書くと
(int型)=(float型の仮数部)<<(float型の指数部)
といった感じです。
指数部が負のときはシフトの向きが逆になります。

これで、ヒントになりませんか?
0019ミザールNGNG
18は理屈の部分を説明するだけの書き込みです。
実際にどれだけシフトするかは15番さんを参照してください。
■ このスレッドは過去ログ倉庫に格納されています