質問するログイン新規登録

質問編集履歴

1

追記

2017/06/20 12:32

投稿

strike1217
strike1217

スコア651

title CHANGED
File without changes
body CHANGED
@@ -53,4 +53,54 @@
53
53
  スティッキービット = 丸め桁の右側に0でないビットがあることを示すものである。
54
54
  つまり、double型の仮数部の52bitの最後の3桁に特別な名前を付けただけという事ですかね?
55
55
 
56
- 2番については間違いがあったらご指摘をお願いします。
56
+ 2番については間違いがあったらご指摘をお願いします。
57
+
58
+ 「追記」
59
+ ```ここに言語を入力
60
+ #include <iostream>
61
+ #include <math.h>
62
+
63
+ int main()
64
+ {
65
+ float value = 1.73214;
66
+
67
+ int exp;
68
+ float x = std::frexp(value, &exp);
69
+
70
+ printf("%1.60lf = \n", value);
71
+ printf("%1.60lf * 2^ %08d\n", x, exp);
72
+
73
+ union { float f; int i; } a;
74
+ a.f = value;
75
+
76
+ printf("%f ( %08X )\n", a.f, a.i);
77
+
78
+ /* ビットの列を表示します */
79
+ for (int i = 31; i >= 0; i--) {
80
+ printf("%d", (a.i >> i) & 1);
81
+ }
82
+ printf("\n");
83
+
84
+ /* 指数部( 1ビット )、指数部( 8ビット )、仮数部( 23ビット )を取り出します */
85
+ printf("符号部 : %x\n", (a.i >> 31) & 1);
86
+ printf("指数部 : %x\n", (a.i >> 23) & 0xFF);
87
+ printf("仮数部 : %x\n", a.i & 0x7FFFFF);
88
+ }
89
+
90
+ ```
91
+ 1.732139945030212402343750000000000000000000000000000000000000 =
92
+ 0.866069972515106201171875000000000000000000000000000000000000 * 2^ 00000001
93
+ 1.732140 ( 3FDDB6C3 )
94
+ 00111111110111011011011011000011
95
+ 符号部 : 0
96
+ 指数部 : 7f
97
+ 仮数部 : 5db6c3
98
+
99
+ 結果はこのようになりました。
100
+
101
+ 問題はここからで、
102
+ 仮数部の16進数を10進数に直すと、6141635となります。
103
+ (指数部を10進数にすると127でした。)
104
+
105
+ frexp関数の仮数部とは大きく異なる値です。
106
+ そして、この6141635から0.866069972515106201171875にどうやって変換しているのかさっぱりです。