質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

3088閲覧

float型の指数部分の取得について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/24 14:33

タイトル通りなんですがfloat型の指数部分の取得方法はどのようなものがありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/26 10:00

参考にさせていただきます。あいがとうございます。
退会済みユーザー

退会済みユーザー

2020/05/26 12:26

ちなみにdouble型であればどうなるのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/26 12:56

わざわざありがとうございます。勉強がはかどりそうです!
guest

0

%eでsprintfしたのをsscanfでどうだろう。
(ドラえもんの未来クイズみたいな文面になってしまった)

投稿2020/05/24 15:05

e-watt

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2020/05/24 14:41

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「c言語 float」でぐぐれば、指数部のビットパターンがどこに格納されてるか分かるので、それをもとに取り出せばいいです

ましかし、このビットパターンは実装、あるいは環境により変わるので、あなたの取得しようとする環境ではどうなるのか調べる必要がありますねー

投稿2020/05/24 14:36

編集2020/05/24 14:38
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問