小数の計算に注意!FPUとfloat型の関係
ロボットを作るとき、小数の計算は避けて通れません。
センサーの値や、モーターの制御など、様々な場面で小数を扱います。
しかし、小数の計算には注意が必要です。特に、FPU (Floating Point Unit) を理解していないと、思わぬ落とし穴にはまることがあります。
センサーから取得した値、頑張って計算した指令値、なるべく精度を保ちたいですよね?
それならと、桁数の多いdouble型を使いたくなるかもしれません。
しかし、実はdouble型を使うと、マイコンの性能を十分に発揮できないんです。なぜでしょうか?
それは、FPU という小数計算を高速化するためのハードウェアが、float型にしか対応していないからです。
float と double の違い
| 型 | 精度 | bit | マイコンでは.. |
|---|---|---|---|
| float | 普通(約7桁) | 32 | ◎ |
| double | 高い(約15桁) | 64 | ✕ 基本使わない |
FPUとは?
FPU(Floating Point Unit)は、 小数の計算を速くするための専用ハードウェアです。多くのSTM32などのマイコンには、FPUが搭載されているモデルがあります。
簡単なイメージ
FPU なし → ソフトで計算(遅い)
FPU あり → ハードで計算(速い)
FPUのおかげで、float型の計算は非常に速くなります。 しかし、double型はFPUが対応していないため、ソフトで計算されることになり、非常に遅くなります。
さらに、double型はfloat型の約2倍のメモリを使用するため、メモリの無駄遣いにもなります。 実行時間が数倍から数百倍になるなんてことも珍しくありません。
折角マイコンの性能を活かすためにFPUがあるのに、double型を使うとその性能を十分に発揮できないのはもったいないですよね?
マイコンのプログラムでは、基本的にfloat型を使うことをおすすめします。
.fの意味
C言語では、小数リテラル(例えば 3.14)は、デフォルトで double型 として扱われます。
そのため、float 型の変数に小数リテラルを代入する場合は、リテラルの後ろに .f を付ける必要があります。
例えば、float pi = 3.14f; と書くことで、3.14 が float 型として扱われ、FPUで高速に計算されるようになります。
もし、float pi = 3.14; と書いてしまうと、3.14 は double 型として扱われ、float 型に変換される際に精度が落ちる可能性がありますし、FPUの性能も十分に活かせません。
したがって、小数リテラルをfloat型で使用する場合は、必ず.fを付けることをおすすめします。
まとめ
- 小数の計算にはFPUが重要。
- FPUはfloat型にしか対応していない。
- double型はFPUが使えないため、遅くなり、メモリも多く使う。
- マイコンのプログラムでは、基本的にfloat型を使うことをおすすめします。
- 小数リテラルをfloat型で使用する場合は、必ず
.fを付けること。
ロボットを動かすのには、正確な数値も大事ですが、速い計算も重要です。 FPUを活用して、効率的なプログラムを書きましょう!