質問編集履歴

1

追記

2017/06/20 12:32

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -109,3 +109,103 @@
109
109
 
110
110
 
111
111
  2番については間違いがあったらご指摘をお願いします。
112
+
113
+
114
+
115
+ 「追記」
116
+
117
+ ```ここに言語を入力
118
+
119
+ #include <iostream>
120
+
121
+ #include <math.h>
122
+
123
+
124
+
125
+ int main()
126
+
127
+ {
128
+
129
+ float value = 1.73214;
130
+
131
+
132
+
133
+ int exp;
134
+
135
+ float x = std::frexp(value, &exp);
136
+
137
+
138
+
139
+ printf("%1.60lf = \n", value);
140
+
141
+ printf("%1.60lf * 2^ %08d\n", x, exp);
142
+
143
+
144
+
145
+ union { float f; int i; } a;
146
+
147
+ a.f = value;
148
+
149
+
150
+
151
+ printf("%f ( %08X )\n", a.f, a.i);
152
+
153
+
154
+
155
+ /* ビットの列を表示します */
156
+
157
+ for (int i = 31; i >= 0; i--) {
158
+
159
+ printf("%d", (a.i >> i) & 1);
160
+
161
+ }
162
+
163
+ printf("\n");
164
+
165
+
166
+
167
+ /* 指数部( 1ビット )、指数部( 8ビット )、仮数部( 23ビット )を取り出します */
168
+
169
+ printf("符号部 : %x\n", (a.i >> 31) & 1);
170
+
171
+ printf("指数部 : %x\n", (a.i >> 23) & 0xFF);
172
+
173
+ printf("仮数部 : %x\n", a.i & 0x7FFFFF);
174
+
175
+ }
176
+
177
+
178
+
179
+ ```
180
+
181
+ 1.732139945030212402343750000000000000000000000000000000000000 =
182
+
183
+ 0.866069972515106201171875000000000000000000000000000000000000 * 2^ 00000001
184
+
185
+ 1.732140 ( 3FDDB6C3 )
186
+
187
+ 00111111110111011011011011000011
188
+
189
+ 符号部 : 0
190
+
191
+ 指数部 : 7f
192
+
193
+ 仮数部 : 5db6c3
194
+
195
+
196
+
197
+ 結果はこのようになりました。
198
+
199
+
200
+
201
+ 問題はここからで、
202
+
203
+ 仮数部の16進数を10進数に直すと、6141635となります。
204
+
205
+ (指数部を10進数にすると127でした。)
206
+
207
+
208
+
209
+ frexp関数の仮数部とは大きく異なる値です。
210
+
211
+ そして、この6141635から0.866069972515106201171875にどうやって変換しているのかさっぱりです。