Trimble Thunderbolt GPS-DOから送られてきたパケットの中に、100MHz・1ppsのズレや、内部温度等の値を表す単精度浮動小数点が含まれている。それらの表示が問題になった。

浮動小数点といっても、整数部は絶対値1000以下の値を表示すればよい。温度やズレは100以下と限定しても全く問題ないので。しかし、小数部はなるべく精度よく表示したい。Trimble社自家製管理制御ソフトTboltmon.exeでは、温度について小数部1桁、精度のズレについては小数部2桁としか表示していないが、カッコよく見せるためにも、温度については2桁、精度については4桁を表示したい。

PIC用Cコンパイラには、無料のHi-Tech C Pro Lite modeを利用している。それが原因かどうかは分からないが、浮動小数点を使おうとするとコードサイズが一気に大幅増える。PIC16F88のような4KW容量ものではいつも苦労する。

Hi-Techの倍精度実数に24ビット表現と32ビット表現の2種類がある。24ビット表現では当然今回のケースにダメなので、32ビットでチャレンジしたがうまく行かなかった。

コードサイズのこともあり、うまく行かなかった理由をほとんど追求せず、整数だけでやってみることにした。つまり、浮動小数点を整数部と小数部とにわけて、それぞれをlong型整数で表そうとすることだ。とくに今回はパケットのデータを取り出して表示するだけなので、浮動小数点同士の演算が必要なく、整数表現は適当だと判断した。

さて、単精度浮動小数点として、IEEE 754形式が一般的。パケットにある浮動小数点も754形式で表されている。「ThunderBolt GDS Disciplined Clock User Guide Version 5.0」では
  754 IEEE Standard for binary Floating-Point Arithmetic. They are sent Most-significant byte first. Note that switching the byte order will be required in Intel-based machines.
  Single — Float (4 bytes) (3.4×10-38 to 1.7×1038) (24 bit precision)
と記述してある。

プログラムを書き、実際に検証した。パケットから浮動小数点を表す4バイトを取り出し、整数部と小数部に分けて表示した結果が、ソフトTboltmon.exeと同一表示になっているかどうかを確かめた。

以下はC言語ソースプログラム(漢字が入っているので、シフトJISコードで見てください)。バグがあってもトラブっても責任は負えないが。

main_c.txt

Comments are closed.

Post Navigation