三角関数を扱うための数学的知識を解説してきましたが、プログラムにも必要な基礎知識があります。
三角関数からの出力は-1から1の間の主に小数点以下の値が対象となります。
また、三角関数への入力は基本的に
ラジアンなのでこちらも小数点以下の値が重要となります。
これまで当ブログではshort型、long型、char型を扱ってきました。
・char型 8bit(範囲は-128~127、unsignedは0~255)
・short型 16bit(範囲は-3万ぐらい~3万ぐらい、unsignedは0~6万5千ぐらい)65535
・long型 32bit(範囲は-20億ぐらい~20億ぐらい、unsignedは0~43億ぐらい)4294967295
また、int型も使用しています
・int型 sh71251、rx220だと32bit(long型相当)
これらはすべて整数型で小数点以下の値を切り捨ててしまいます。
小数点以下の値を扱うためには新しい型の変数が必要になります。
それが
浮動小数点型です。
浮動小数点って何?
普段数字を扱う場合小数点も含めて数字を書くと
12
.0×100
.0=1200
.0
0
.034÷1000
.0=0
.000034
の様になると思ます。
小数点は一の位の右側に固定されています。
これに対して計算結果を浮動小数点式で書くと
1
.2×10^3
3
.4×10^-5
となります。
計算結果に応じて一の位の右側に固定されていた小数点が
10の3乗の右側に移動したり、10の15乗の右側に移動したりと、表記上の位置が
ふわふわ移動します。
なので、
浮動小数点と呼ばれます。
名付けた人のイメージ的には水面に小数点が浮かんでいて、水の量に合わせて小数点が浮き沈みしていたのかもしれません。
浮動小数点型の使い道0から1の間の小さい値を使いたい時に使用します。
また、ものすごく大きな値を使いたい時にも使用します。
・float型 32bit(範囲は約±10^38、最小値は約10^-38)
・double型 64bit(範囲は約±10^308、最小値は約10^-308)
三角関数を扱ううえで必要になります。大きな数字も小さな数字も扱えますが、何にでも使えるわけではありません。
浮動小数点型の構造
コンピュータ内の数字は基本的に2進数でしたが、小数点以下の数字についても2進数で表します。
構造について考えてみます。例えば
1200.0→
1.2×10^
3の場合、
1.2に相当する部分と10^
3に相当する部分(と符号)に分かれます。
1.2の部分を
仮数、10^
3の部分を
乗数と呼びます。
これを2進数で表現します。
とりあえず1200.0を2進数に変換すると
0b 10010110000
となります。
0b 10010110000=0b 1001011000.0×2^1=0b 100101100.00×2^2
と変換していくと
0b 10010110000=
0b 1.0010110000×2^
10となります。
続いて1以下の数字の場合。
小数点以下であっても2^nにて数字を表します。
たとえば0.5を2進数に変換すると
0.5=2^-1=0b 0.1
0.25を2進数に変換すると
0.25=2^-2=0b 0.01
0.625を2進数に変換すると
0.625=0.5+0.125=2^-1+2^-2=0b 0.1+0b 0.001=0b 0.101
0.1だと・・・
0.1=0.0625+0.03125+0.00390625+0.001953125+・・・=0b 0.000110011・・・
となります。さらに変換すると
0b 0.000110011=
0b 1.10011×2^
-4と変換できました。
0.000034だと
0.000034=
0b 1.00011101×2^
-15となります。
float型とdouble型の違いは仮数部のビット数と指数部で使える値の範囲です。
float型:仮数部23bit(有効数字8桁ぐらい)、指数部8bit(-128~127)、符号1bit
→合計32bit(4Byte)
double型:仮数部52bit(有効数字16桁ぐらい)、指数部11bit(-1024~1023)、符号1bit
→合計64bit(8Byte)
※2019/05/03追記ただし、ルネサスのコンパイラでは標準だとdouble型でも4Byteで計算するように設定されており、実質的にfloat型と同じ精度になります。(RXのみ?)
double型を8Byteで扱うためにはプロジェクト作成時のオプションにてdouble型の精度を「単精度」⇒「倍精度」へ変更する必要がありそうです。
作成済みのプロジェクトについてはビルドのツールチェインから
オプション -dbl_size=8を追加するものと思われます。※2020/01/10訂正CPUのタグで詳細
double型の精度を倍精度
にて設定変更します。
CS+の場合CC-RXのプロパティー
double型、およびlong double型の精度
浮動小数点型のトラブル
有効桁数
先の説明の通り、浮動小数点型には扱える数字の大きさとは別に有効数字が存在します。
例えば1.0×10^10+1と計算したい場合には有効桁数11桁以上が必要になりますが、
float型だと有効桁数8桁ぐらいなので正しく計算が行えません。
ここまで有効数字を気にする事は少ないかもしれませんがGNSS(GPS)関連のデータを扱う際には注意が必要です。
小数点以下の数字の精度
10進数で普通に計算すると
0.1×10=1
ですが、2進数では0.1を正確に変換できません。
float型だと2*10^-9ぐらいの誤差が発生します。
このため
0.1×10≒1
の様な扱いになります。
従って条件文等で
if( 浮動小数点型変数==閾値 )
と一見問題なく動きそうな場合でも条件一致しない可能性があります。
浮動小数点型を使って条件文を作る際は、閾値に少し幅を持たせて
if( 浮動小数点型変数>閾値-0.01 && 浮動小数点型変数<閾値+0.01 )
等としておく必要があります。