一部の数値を2進数から浮動小数点に変換すると、問題が発生する可能性があることを私は知っています。
例:1.4は1.39999になります。6.2は6.199999、6.6は6.599999などです。
どの数字がこれらの問題を引き起こすかを計算する方法はありますか?正確に変換されない1〜50,000の数値を使用して、ある種のスプレッドシートまたはデータベースを作成するようなものですか?
浮動小数点計算のエラーは、浮動小数点数が格納される方法に根ざしています。使用している精度に応じて (通常は単精度 (浮動小数点) または倍精度)。倍精度浮動小数点数はより多くのスペースを必要としますが、精度は約 2 倍になります。
通常、浮動小数点数は IEEE 形式で格納されるため、最上位ビットのみが含まれます。
浮動小数点数を表すためにこのように格納されたビットの文字列には、数値を構成するさまざまな部分があります。まず、数値が正か負かを示す符号ビットがあります。次に、数値の指数部分が格納されます (単精度浮動小数点数では、これには 8 ビットが必要です)。指数の後の残りのすべてのビットは、数値の有効桁数を表します。したがって、ビット 1 10000000 01000000000000000000000 は -0.5 を表します。符号ビット (最初のビット) は、数値が負であることを示します。次の 8 ビットは指数です。通常、指数は、大きい数値に加えて小さい数値が正確に格納されるように、バイアスをかけて格納されます。これを行うために、計算に使用される指数は -127 (8 ビット指数の場合) + 整数として解釈される指数ビット (この場合は 128) です。
さらなる例として、チェックボックスを使用してビットを示すコンバーターを次に示します。最悪の場合、関心のあるすべての組み合わせをテストするボットを作成することもできます。
一般に、2 のべき乗の組み合わせで直接作られない分数で記述できない場合は、四捨五入されます。(1/2+1/4+1/8などで取れない場合は多分丸められます)
ほとんどすべての数値が面倒です。マイナーな例外として、繰り返し 2 を掛けると小数部分が取り除かれ、最終的に 2^24 未満になることがあります。
例えば
0.125 -> 0.25 -> 0.5 -> 1.0 ! OK
6.4 --> 12.8 --> 25.6 -> 51.2 -> 102.4 : we got a cycle! (.4 .8 .6 .2 ... )
編集
問題の目的/コンテキストを考えると、浮動小数点がゼロに向かって丸められると、不正確さが問題を引き起こすようです。
例えば
10.2 == 10.199999809, when the next floating point would be
next == 10.200000763 <-- the difference to the wanted value is ~4 times higher
vs.
10.3 == 10.300000197, when the previous (rounded down fp would be)
prev == 10.299992370, <-- this would have been also ~4x further from away
おそらく、CNC ドライバーのプログラマーと話をする時が来ました...