質問編集履歴
1
追記
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にどうやって変換しているのかさっぱりです。
|