teratail header banner
teratail header banner
質問するログイン新規登録
C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

4回答

3816閲覧

uint32_tのデータを小数で表示したい

YOshim

総合スコア1094

C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2022/02/13 02:00

編集2022/02/13 02:23

0

0

現在Spresenseを用いてArduino IDEでセンサから出力される2バイトx2のデータを取得し結合して4バイト(32bit)にしたものを10進数で表示しようとしています。4バイトのデータは単精度浮動小数点の形式で出力されているので小数点を含む10進数でデータを表示したいです。
データ取得はできたのですが、小数で表示しようとしてもデータが0.00となってしまいます。
コードは以下です。

uint32_t temp32;//データ /* データ取得の操作、省略 */ int8_t f = pow(-1, (int)(temp32 >> 31)); double k = 1 + (double)(((temp32 & 0x7FFFFF))/pow(2,23)); float s = (float)pow(2,(int8_t)((uint8_t)(((temp32 >> 23) & 0xFF)-127))); Serial.println(f*k*s);

uint32_tもfloatも4バイトなのでキャストすれば出力されるのではと考えましたが、4バイトのデータに.00が記載されるだけの表示となり、正常に表示されませんでした。

uint32_t temp32;//データ /* データ取得の操作、省略 */ Serial.println((float)temp32);

良い方法があれば教えて頂けませんでしょうか。

以上、宜しくお願い致します。

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

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

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

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

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

guest

回答4

0

ご提示の方法だと、正規化数にしか対応していないので、それ以外(ゼロ、非正規化数、無限大、NaN)が正しく変換されません。直接floatにコピーしてしまうのはどうでしょうか。

c

1 float ret; 2 memcpy(&ret, &temp32, sizeof(ret));

投稿2022/02/13 02:30

actorbug

総合スコア2515

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

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

YOshim

2022/02/13 02:45

>ご提示の方法だと、正規化数にしか対応していないので、それ以外(ゼロ、非正規化数、無限大、NaN)が正しく変換されません。 なるほど、大変勉強になります。別の型を用意してメモリ操作で内部データをコピーすれば対応できるという旨を理解致しました。
guest

0

ベストアンサー

C

1 uint32_t a; 2 float b; 3 4 a = 内部がfloat形式のデータ; 5 b = *((float*)&a);

ということでしょうか。

投稿2022/02/13 02:33

otn

総合スコア86354

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

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

ozwk

2022/02/13 02:39

未定義動作だったような
otn

2022/02/13 02:40

union { uint32_t i; float f; } x; を使うのが正攻法かもしれません。
YOshim

2022/02/13 02:45

ありがとうございます。未定義動作かもとのことですが、手元の環境ではこちらの方法でうまくいきました。 非常に簡易に記述できることもありいったんはこちらで対応しようと思います
otn

2022/02/13 03:04

「未定義かも」じゃなくて規格上は「未定義」ですが、普通動くと思います。 あるいは、 union { uint32_t i; float f; } x; x.i = a; b = x.f;
guest

0

floatの変数rを用意し、rのアドレスをuint8_tでキャストしたポインタ変数prを用意します。
同様に元となるuint32_tの変数のアドレスをuint8_tでキャストしたポインタ変数piを用意します。
pv[0]〜[3]にpi[0]〜[3]を代入します。

もしくはmemcpy

投稿2022/02/13 02:38

編集2022/02/13 02:40
ozwk

総合スコア13553

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

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

0

uint32_t というのは整数変数です
小数点以下は存在しません

なにをしたいんでしょうか


センサの2バイトのデータ2つを転送したいなら、余計なことをせずにそのまま結合した4バイトで転送すればどうなんでしょうか

投稿2022/02/13 02:09

編集2022/02/13 02:22
y_waiwai

総合スコア88180

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

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

YOshim

2022/02/13 02:18 編集

説明が不足していました、ありがとうございます。 センサから2バイトx2のデータを取得し結合して4バイト(32bit)にします。 4バイトのデータは単精度浮動小数点の形式で出力されているので10進数でデータを表示したいです。 *説明に追記しておきます。
y_waiwai

2022/02/13 02:20

あまりに説明不足すぎです 提示しているコードもろくな説明なく丸投げされても困ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問