なぜ浮動小数点で表されている数値の精度が落ちるのか

更新しました Jun 30, 2022

使用製品

ソフトウェア

  • LabVIEW

問題

浮動小数点または倍精度の数値を使用していると、数値がわずかに変わることに気づきました。例えば、2.4を入力した時には、2.3999999999999999が出力されてしまいます。なぜこのような正確でない浮動小数点の値が出力されてしまうのですか? 

解決策

浮動小数点が正確に表示されない理由は主に2つあります。

1. 2進法で書かれている10進の数が正確ではない
 
特定の浮動小数点の単精度あるいは倍精度で表示された値が異なってしまうのは決して珍しいことではありません。一般的に浮動小数点式の10進値は、CPUが浮動小数点を表現する方法の制約から、正確な2進法の表現を持っておりません。このために、浮動小数点で表された数値の精度が落ちてしまうことがあり、場合によっては、浮動小数点同士の処理によって、予期しない結果が出てしまう場合もあります。上に示されたケースでは、2.4の2進法表現が、ちょうど2.4ではないということがいえます。代わりに、最も綿密な2進法の表現は2.3999999999999999です。これは、浮動小数点表記が、二つの異なるパート(指数部と仮数部)から生成されていることから起こります。浮動小数の値は特定の数式を使用して計算されます。この定式についての詳細は、下記の"What is a Mantissa or a Significand?"のリンク先をご参照下さい。 

この浮動小数点の精度の損失は、ほとんどのオペレーティング・システムおよびほとんどのプログラミング環境で生じてしまう問題です。 

: 精度を維持するために二進化十進法(BCD)ライブラリを使用することができます。BCDは個々の10進の数字を別々にコード化する方法です。

さらに詳しい説明については、IEEE/ANSIのStandard 754-1985 によって規格化されたStandard for Binary Floating Point Arithmeticをご参照下さい。 

2. 異なったデータタイプの組み合わせによるもの 

単精度と倍精度の二つを混合して処理を行った場合、精度が落ちてしまいます。精度を失わずに、計算処理を行うためには、同タイプの数値で処理が行われていることをご確認下さい。

: 単精度の有効桁数は7桁、倍精度の有効桁数は15桁です。