【问题标题】:C double to Exponential round errorC 双倍指数舍入误差
【发布时间】:2012-11-23 12:49:02
【问题描述】:

我正在尝试将双精度值转换为指数,但出现舍入错误。

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 位服务器上进行此转换以及如何进行?

【问题讨论】:

  • 感谢您不要复制和粘贴代码...
  • @glglgl 我对他的帖子进行了编辑,现在或很快你应该可以看到它。
  • 其实2.0895549999999998E+09(更准确地说是十六进制0x1.f23050dffffffp30)是(double)2089.555乘以1000000的双精度乘法的正确结果。32位计算机是正确的, 64 位计算机在计算过程中或在转换为字符串的过程中做了一些奇怪的事情
  • 要求打印更精确,%.7f 应该会告诉您不同之处。

标签: c decimal exponential


【解决方案1】:

不是舍入误差,而是浮点数的表示特征。大多数短分数,例如 1.1,都是以 2 为底的无限级数(如 1/3 = 0.3333...,以 10 为底)。因此,必须将其夹在某个地方。转换回十进制后,您将得到 2.08955499999。

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

【讨论】:

  • base 10 等等,是两个还是十个;-)
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2021-04-21
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2018-11-15
相关资源
最近更新 更多