タイトル通りなんですがfloat型の指数部分の取得方法はどのようなものがありますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
double でなくて、float なんですね。
IEEE 754規格で指数部の値を取得する方法を 2つ示します。
どちらが希望通りのものですか?
C
1#include <stdio.h> // sprintf 2#include <stdlib.h> // atoi 3 4int get_exp1(float x) 5{ 6 return ((*(int *)&x) >> 23 & 0xff) - 127; 7} 8 9int get_exp2(float x) 10{ 11 char buf[20]; 12 sprintf(buf, "%+.6a", x); 13 return atoi(buf + 12); 14} 15 16int main(void) 17{ 18 float f; 19 while (printf(">> "), scanf("%f", &f) == 1) { 20 printf("%d\n", get_exp1(f)); 21 printf("%d\n", get_exp2(f)); 22 } 23}
追記
<math.h> の frexp (これは doulbe用) を忘れていました。
float 用は frexpf で、long double 用は frexpl。
仮数部が [0.5, 1.0) の範囲での指数を返します。
float の IEEE754 の内部表現では、仮数部が [1.0, 2.0) の範囲なので、
それに合わせると、指数部が 1 小さくなります。
C
1#include <math.h> // frexp 2 3int get_exp3(float x) 4{ 5 int exp; 6 frexpf(x, &exp); 7 return exp - 1; 8}
追記2
double の場合です。
C
1#include <stdio.h> // sprintf 2#include <stdlib.h> // atoi 3#include <math.h> // frexp 4 5int get_exp1(double x) 6{ 7 return ((*(long long *)&x) >> 52 & 0x7ff) - 1023; 8} 9 10int get_exp2(double x) 11{ 12 char buf[28]; 13 sprintf(buf, "%+.13a", x); 14 return atoi(buf + 19); 15} 16 17int get_exp3(double x) 18{ 19 int exp; 20 frexp(x, &exp); 21 return exp - 1; 22} 23 24int main(void) 25{ 26 double d; 27 while (printf(">> "), scanf("%lf", &d) == 1) { 28 printf("%d\n", get_exp1(d)); 29 printf("%d\n", get_exp2(d)); 30 printf("%d\n", get_exp3(d)); 31 } 32}
追記3
get_exp2 にデバッグ用の puts(buf); が残っていたのを削除しました。
投稿2020/05/24 19:15
編集2020/05/26 14:21総合スコア8224
0
投稿2020/05/24 14:41
総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「c言語 float」でぐぐれば、指数部のビットパターンがどこに格納されてるか分かるので、それをもとに取り出せばいいです
ましかし、このビットパターンは実装、あるいは環境により変わるので、あなたの取得しようとする環境ではどうなるのか調べる必要がありますねー
投稿2020/05/24 14:36
編集2020/05/24 14:38総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/26 10:00
退会済みユーザー
2020/05/26 12:26
退会済みユーザー
2020/05/26 12:56