C加倍到指数轮错误

时间:2012-11-23 12:49:03

标签: c decimal exponential

我正在尝试将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位服务器上进行此转换以及如何工作?

1 个答案:

答案 0 :(得分:4)

它不是舍入错误,而是浮点的表示特征。大多数短分数如1.1是基数2中的无穷级数(在基数10中为1/3 = 0.3333 ...)。因此,必须将它夹在某处。当转换回十进制时,你得到2.08955499999。

在第一种情况下,请求printf函数将其舍入为默认精度%f,即小数分隔符后的小数点后6位。在第二种情况下,你要求22位数的精度并得到它......