0

double値を指数に変換しようとしていますが、丸め誤差が発生します。

int main (unsigned int argc, char **argv)
{
    float a=293.17;
    float b=293.10;
    double ULfreq = 2089.555000;
    double upfreq = 0.0;
    long int t = 0;
    long int u = 0;

    upfreq = ULfreq * 1000000.0;

    printf(" %f, upfreq:%22.16E\n", upfreq, upfreq);

    return 0;
}

このコードを32ビットコンピューターで実行すると、次の結果が得られます。

2089555000.000000, upfreq:2.0895549999999998E+09

64ビットで実行すると正しい答えが得られます。

この変換を32ビットサーバーで機能させることは可能ですか?

4

1 に答える 1

4

これは丸め誤差ではなく、浮動小数点の表現機能です。1.1などのほとんどの短い分数は、基数2では無限級数です(基数10では1/3 = 0.3333 ...)。したがって、どこかにクリップする必要があります。10進数に戻すと、2.08955499999が得られます。

最初のケースでは、printf関数にデフォルトの精度である%fに丸めるように要求します。これは小数点記号の後の小数点以下6桁です。2番目のケースでは、22桁の精度を要求し、それを取得します...

于 2012-11-23T12:57:16.927 に答える