回答編集履歴

3

debug用の puts(buf); を削除

2020/05/26 14:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -122,8 +122,6 @@
122
122
 
123
123
  sprintf(buf, "%+.13a", x);
124
124
 
125
- puts(buf);
126
-
127
125
  return atoi(buf + 19);
128
126
 
129
127
  }
@@ -163,3 +161,9 @@
163
161
  }
164
162
 
165
163
  ```
164
+
165
+
166
+
167
+ **追記3**
168
+
169
+ get_exp2 にデバッグ用の puts(buf); が残っていたのを削除しました。

2

double のコードを追加

2020/05/26 14:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -87,3 +87,79 @@
87
87
  }
88
88
 
89
89
  ```
90
+
91
+
92
+
93
+ **追記2**
94
+
95
+ double の場合です。
96
+
97
+ ```C
98
+
99
+ #include <stdio.h> // sprintf
100
+
101
+ #include <stdlib.h> // atoi
102
+
103
+ #include <math.h> // frexp
104
+
105
+
106
+
107
+ int get_exp1(double x)
108
+
109
+ {
110
+
111
+ return ((*(long long *)&x) >> 52 & 0x7ff) - 1023;
112
+
113
+ }
114
+
115
+
116
+
117
+ int get_exp2(double x)
118
+
119
+ {
120
+
121
+ char buf[28];
122
+
123
+ sprintf(buf, "%+.13a", x);
124
+
125
+ puts(buf);
126
+
127
+ return atoi(buf + 19);
128
+
129
+ }
130
+
131
+
132
+
133
+ int get_exp3(double x)
134
+
135
+ {
136
+
137
+ int exp;
138
+
139
+ frexp(x, &exp);
140
+
141
+ return exp - 1;
142
+
143
+ }
144
+
145
+
146
+
147
+ int main(void)
148
+
149
+ {
150
+
151
+ double d;
152
+
153
+ while (printf(">> "), scanf("%lf", &d) == 1) {
154
+
155
+ printf("%d\n", get_exp1(d));
156
+
157
+ printf("%d\n", get_exp2(d));
158
+
159
+ printf("%d\n", get_exp3(d));
160
+
161
+ }
162
+
163
+ }
164
+
165
+ ```

1

frexpバージョンのコードを追加

2020/05/26 12:42

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -53,3 +53,37 @@
53
53
  }
54
54
 
55
55
  ```
56
+
57
+
58
+
59
+ **追記**
60
+
61
+ <math.h> の frexp (これは doulbe用) を忘れていました。
62
+
63
+ float 用は frexpf で、long double 用は frexpl。
64
+
65
+ 仮数部が [0.5, 1.0) の範囲での指数を返します。
66
+
67
+ float の IEEE754 の内部表現では、仮数部が [1.0, 2.0) の範囲なので、
68
+
69
+ それに合わせると、指数部が 1 小さくなります。
70
+
71
+ ```C
72
+
73
+ #include <math.h> // frexp
74
+
75
+
76
+
77
+ int get_exp3(float x)
78
+
79
+ {
80
+
81
+ int exp;
82
+
83
+ frexpf(x, &exp);
84
+
85
+ return exp - 1;
86
+
87
+ }
88
+
89
+ ```