C - 小数字的浮点舍入

标签 c floating-point rounding-error

在 Intel(R) Core(TM) i7-4790 上运行这段代码,我得到了奇怪的结果:

#include <stdio.h>
#define CALCULUS 2052 - 1.0 - margin
void main(void)
{
    float margin = 1.0001;
    float a = CALCULUS;
    printf("%2.6f\t%2.6f\n", a, CALCULUS);
}

我有

$ gcc test2.c && ./a.out
2050.000000 2049.999900

有人可以解释这种行为吗? 我知道当我使用 double 而不是 float 时不会发生这种情况,但我发现舍入发生在如此小的数字上令人惊讶。

最佳答案

float a = CALCULUS;

存储在a中的值当然是 32 位单精度浮点值。 CALCULUS 的结果扩展由 double 转换而来到 floata 的初始化中.

但是当你通过 CALCULUS 的扩展时直接到printf这是一个double传递的值。

简而言之,2052 - 1.0 - margin的结果是 double .

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

相关文章:

javascript - 在散列函数中使用 Javascript 中的 float

floating-point - 用于数论应用的扩展精度浮点的快速计算

scala - 在 Scala 中舍入 double 或 float 的最佳方法是什么?

python - Pandas isin() 函数无法正确识别数字匹配

c - 如何在Linux环境下使用C chdir

php - 远程服务器上的 exec() 仅返回 return-var 1 |尝试了7种方法但没有成功

c - C 程序中的条件未给出所需的结果

java - 原始浮点值如何为-0.0?这意味着什么?

python - 核心转储 : Extract all the global variables , 核心转储中的数据结构和子结构

objective-c - RoundOffTest() 似乎向上和向下舍入