c - C中的浮点舍入

标签 c floating-accuracy

我在使用 float 时遇到了一些奇怪的舍入行为。下面的代码演示了这个问题。解决这个问题的最佳方法是什么?我一直在寻找解决方案,但运气不佳。

#include<stdio.h>

int main(void)
{   
    float t;
    t = 5592411;
    printf("%f\n", 1.5*t);
    t *= 1.5;
    printf("%f\n", t);
    return 0;
}

上面的代码应该打印出相同的值,但我在使用 GCC 4.7.2 的设置中得到了这个值:

8388616.500000

8388616.000000

如果我使用计算器,我会得到第一个值,所以我假设第二个值以某种方式四舍五入。我有相同的 Fortran 代码,它不对值进行舍入(具有 0.5)。

最佳答案

1.5 是一个 double 常量而不是一个 float 并且 C 有自动升级规则。因此,当您执行 1.5*t 时,发生的是 (i) t 转换为 double; (ii) double 乘以 double 1.5; (iii) double 被打印(因为 %fdouble 的格式化程序)。

相反,t *= 1.5t 提升为 double ,执行 double 乘法,然后截断结果以将其存储回 [单精度] float

要获得证据,请尝试:

float t;
t = 5592411;
printf("%f\n", 1.5f*t); // multiply a float by a float, for no promotion
t *= 1.5;
printf("%f\n", t);
return 0;

或者:

double t; // store our intermediate results in a double
t = 5592411;
printf("%f\n", 1.5f*t);
t *= 1.5;
printf("%f\n", t);
return 0;

关于c - C中的浮点舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798338/

相关文章:

c - 从信号处理程序上下文获取 ARC 平台的回溯跟踪

c++ - c 中的 ncr(组合)

python - 大于或等于 float 失败

math - float 学有问题吗?

c++ - Linux 中的可执行文件会影响链接动态库中的浮点精度吗?

c - C语言中如何将缓冲区复制到字符指针

c - 赋值,然后比较 C 中 "if"语句的条件

c - 用 PKCS7 填充 [C]

math - float 学坏了吗?

math - float 学坏了吗?