0

私の仕事は、float の一部を取得して int に格納することでした。 とても簡単に思えました。私はこのテストをしました:

float f = 3.1415f;
printf("int pres. of float: %d\n"
       "int:                %d", *((int *)&f), 31415);

出力:

int pres. of float: 1078529622

int: 31415

31415 が存在する場所を確認するために、ベース 2 に変更しました。

0100 0000 0100 1001 0000 1110 0101 0110 - 3.1415
                    0111 1010 1011 0111 - 31415

どうすればいいのかわからない。分数を単純な整数として取得するにはどうすればよいですか?

4

3 に答える 3

4

3.1415 の代わりに 2.5 を使用すると、かなり理解しやすいので...

したがって、2.5 と 25 は同じバイナリ形式である必要があると想定しています。これはそうではありません。25 = 0x19 = 11001。2.5 = 10.1。まったく同じではありません。

3.1415 に対して同じような計算をしたい場合は、次のようになります。

3      = 11 (I can do that)
1/8    = 0.001  
0.1415 - 0.125 = 0.0165
1/64   = 0.000001
0.0165 - 0.015625 = 0.000875
1/2048 = 0.00000000001

この時点でまだ 0.1415 の分数が残っていますが、大まかな結果は 11.00100100001 です。

ここで、バイナリ出力(仮数部から開始)を比較し、小数点を挿入して、浮動小数点数が「最初のものを無視する」ことを考慮すると、次のようになります。

  11.00100100001
   1.00100100001110

上の落書きが完全に消えていないようです... ;)

于 2013-08-10T09:48:55.170 に答える
2

https://en.wikipedia.org/wiki/IEEE_floating_pointから始める必要があると思います。これは、浮動小数点数のさまざまな表現について教えてくれます

于 2013-08-10T09:34:15.720 に答える
1

重要な合併症が 2 つあります。1 つは、float が 2 進浮動小数点型であるため、3.1415f を正確に表現できないことです。あなたが持っているのは近似値だけです。最も正確に表現可能な float 値は 3.141499996185302734375 です。

もう 1 つは、3.1415f が正規化された数値の範囲内にあることです。つまり、仮数の最上位ビットが格納されている場合、ゼロ以外の 2 進数であるため、格納されません。

于 2013-08-10T09:53:19.950 に答える