IEEE754 単精度浮動小数点数の形式：binary32 の変換 - Arduinoクックブック
TOPに戻る
作りながら学ぶArduino+=電子工作入門
CookBook TOP > IEEE754 単精度浮動小数点数の形式：binary32 の変換
2020年7月 7日 06:35
IEEE754 単精度浮動小数点数の形式：binary32 の変換
Arduino
ESP32
C言語の実数floatは、メモリの中では32ビットの領域を使います。
符号ビット: 1ビット
指数部の幅: 8ビット
仮数部の幅: 23ビット
32ビット＝4バイトのデータは、たとえば、16進で表現すると、
41 c8 00 00
は、実数の25.0です。プログラムで外部とのやり取りで実数を扱えないとき、ASCIIコードだけでデータを送ったり受けることができます。
Modbusの利用 (6) 電力計SDM120M
●メモリの内容を読み出す
共用体unionは、同じメモリ領域に複数の変数を定義できます。Arduino IDE 1.8.13 ESP32で実行しました。
a.x = 3.141592;は実数です。そこを整数型で8桁表示させると、メモリの内容が読み出せます。
  union { float x; int i; } a;
  
  a.x = 3.141592;
  int i;

  printf("x= %f \n", a.x);
  printf("IEEE 754 binary32内部形式は　0x%08x \n", a.i); 
  printf("xのアドレスは 0x%x \n", (unsigned int)&a.x); 


実行結果です。
x= 3.141592
IEEE 754 binary32内部形式は　0x40490fd8
xのアドレスは 0x3ffb1f8c
別の方法です。
実数piのポインタ&piを4バイトのint型でキャストをし、そこが指している内容を読み出します。
    float pi = -3.141592;
    Serial.print("元のデータ ");Serial.println(pi,6);
    uint32_t ii = *((uint32_t*)&pi);
    Serial.print("IEEE 754 binary32内部形式は　");Serial.println(ii,HEX);
●戻す
符号、仮数、指数をそれぞれ分離し、最後に全部かけて、小数点6桁を表示します。
      int8_t f = pow(-1, int(bitRead(ii,31)));
      double  k = 1 + ((((ii<<1)<<8)>>9))/pow(2,23); 
      int32_t s = pow(2,((((ii<<1)>>24))-127));
      Serial.print("内部形式を実数に戻した　");Serial.println(f*k*s,6);
実行結果です。
元のデータ -3.141592
IEEE 754 binary32内部形式は　C0490FD8
内部形式を実数に戻した　-3.141592
●確認
Floating Point to Hex Converterのサイトに行って確認します。
●python
pythonではstruct.packを使う4桁のバイト列が得られます。
初めてのRaspberry Pi BLEプログラミング (5) BME280②温度、気圧、湿度
struct.unpackを使うとと簡単に元の実数へ戻せます。
センサ・シリーズ　温湿度①SHT31 その5 BLEセントラル
（参考にしたURL）浮動小数点数の内部表現を取得してみよう
ツイート
関連記事
超精密温度計の製作⑤7セグLEDに表示
超精密温度計の製作④BLEペリフェラルに
超精密温度計の製作③TMP117の読み出しスケッチ
超精密温度計の製作②マイコンはESP32
超精密温度計の製作①準備
前へ
超精密温度計の製作⑤7セグLEDに表示
次へ
フルカラー7セグメントLEDの点灯①接続
Topへ戻る
Arduinoをはじめる
鉄板はArduino UNO R3を購入して、Arduino IDEをPCにインストールしてプログラムを書き始めることです。
Arduino UNO R3には、性能や機能がほとんど同じ製品がたくさん市販されています。ここでは、「MAKER UNO +」を取り上げています。
Arduino IDEで開発できるマイコンはCortex-M0~M4の製品もあります。ここではソニー「Spresense」を取り上げています。
Wi-Fiもすぐに利用できるのが「ESP32」です。
人気記事
距離を正確に測る　レーザーVL53L1X
距離を正確に測る　レーザーVL53L0X
温度を測る　キャラクタ表示LCDへ温度を表示①
温度を測る　アナログ・センサLM35DZを利用
温度を測って異常を検知　複数1-Wire温度センサ
カテゴリ・アーカイブ
Arduino86
Arduino UNO110
Spresense32
ESP3245
入門11
http5
M5Stack15
準備1
加速度センサ1
Arduino Uno WiFi8
準備4
WiFiNINA4
MAKER UNO +15
準備4
センサ9
MKR ZERO16
準備3
MKR WiFi 10101
準備
Trinket M05
M-DUINO PLC1
入門10
IoT8
micro:bit8
Linduino2
Metro M4 Express Airlift1
NANO EVERY2
Nano 33 IoT6
STM32F4051
nRF528404
Nano 33 BLE16
Feather nRF52840 Sense4
STEM26
インターネット13
センサ81
温度82
湿度33
光9
紫外線1
赤外線5
重さ4
気圧24
電圧5
距離12
加速度2
ガス1
地震3
音4
超音波距離3
MIC1
マスタリング9
Wire36
SPI9
出力26
LCD16
OLED1
eInk1
グラフィック9
LED24
7segment13
モータ17
ステッピング5
サーボ2
DCブラシあり7
ブラシレス5
リレー8
無線8
sigfox2
BLE30
有線5
RS-4855
modbus3
RS-232C (UART)10
AD DA7
A-Dコンバータ10
MCP32082
MCP30082
MCP30021
MCP34252
MCP34211
ADS12202
ADS122U041
ポテンショメータ3
MCP40121
TPL05011
AD51601
MicroPython1
アイソレータ7
SDメモリ1
RTC1
PR1
Raspberry Pi記事
IoTで使うPython入門Step1
ラズベリーパイでステッピング・モータ
ラズパイ IoT
ラズパイ I2C
ラズパイ SPI
月別アーカイブ
2021年1月9
2020年12月5
2020年10月4
2020年9月2
2020年8月2
2020年7月6
2020年6月1
2020年4月18
2020年3月9
2020年2月4
2020年1月2
2019年12月2
2019年11月1
2019年10月5
2019年9月8
2019年8月3
2019年7月9
2019年6月6
2019年5月6
2019年4月10
2019年3月14
2019年2月5
2019年1月18
2018年12月12
2018年11月5
2018年10月15
2018年9月16
2018年8月10
2018年7月11
2018年6月7
2018年5月4
2018年4月7
2018年3月14
2018年2月13
2018年1月13
©2016-2018-電子工作推進プロジェクト…Makerになろう 個人情報の扱い　お問い合わせ
『denshi.club』はクリエイティブ・コモンズ 表示 4.0 国際 ライセンスで提供されています。
