10

double 値から float 値に変換する必要があるコードを書いています。boost::numeric_cast を使用してこの変換を行い、オーバーフロー/アンダーフローを警告します。ただし、その変換により精度が低下するかどうかも知りたいです。

例えば

    double source =  1988.1012;
    float dest = numeric_cast<float>(source);

1988.1 の値を持つ dest を生成します。

この種の精度の損失/丸めを検出できる方法はありますか

4

4 に答える 4

13

You could cast the float back to a double and compare this double to the original - that should give you a fair indication as to whether there was a loss of precision.

于 2010-07-13T17:58:38.250 に答える
11
float dest = numeric_cast<float>(source);
double residual = source - numeric_cast<double>(dest);

したがって、residual探している「損失」が含まれています。

于 2010-07-13T17:59:18.923 に答える
1

単精度浮動小数点数と倍精度浮動小数点数については、これらの記事を参照してください。まず第一に、float は指数が 8 ビットであるのに対し、double は 11 ビットです。したがって、マグニチュードが 10^127 よりも大きいか、または 10^-126 よりも小さいものは、あなたが言及したようにオーバーフローになります。float の場合、数値の実際の桁数は 23 ビットですが、double の場合は 52 ビットです。したがって、明らかに、浮動小数点よりも倍精度の方がはるかに多くの桁数の精度があります。

1.1123 のような数値があるとします。この数値は実際には 1.1123 としてエンコードされない場合があります。これは、浮動小数点数の数字が実際には分数として加算されるために使用されるためです。たとえば、仮数のビットが 11001 の場合、値は 1 (暗黙) + 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * で形成されます。 1/32 + 0 * (64 + 128 + ...)。したがって、正確な数値になるようにこれらの分数を合計できない限り、正確な値をエンコードすることはできません。これはまれです。したがって、ほとんどの場合、精度が低下します。

于 2010-07-13T18:14:39.580 に答える
1

デイブの回答によると、一定レベルの精度の低下が発生します。ただし、それを定量化し、特定の数を超えたときに例外を発生させることに集中したい場合は、浮動小数点数自体を開き、仮数と指数を解析してから、いくつかの分析を行って、あなたの許容範囲を超えました。

しかし、朗報です。これは通常、標準の IEEE 浮動小数点数です。:-)

于 2010-07-13T18:18:25.403 に答える