浮点数除法给出不同的结果

And*_*lmy 3 c

我正在尝试在 C 中使用浮点数执行除法。为了演示我的意思,您可以运行以下代码。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define TEST 20.0 / 65536.0

int main() {
    float a = 11.147;
    printf("%f\n", a);

    float b = 20.0 / 65536.0;
    printf("%f\n", b);

    float c = a/b;
    printf("%f\n", c);

    int d = (int) c;
    printf("%d\n", d);
    
    float e = a/(float) TEST;
    printf("%f\n",e);

    printf("%f\n", TEST);
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了以下结果

11.147000
0.000305
**36526.492188**
36526
**0.000009**
0.000305
Run Code Online (Sandbox Code Playgroud)

我突出显示的值应该是相同的,因为它是相同公式的结果。唯一的区别是我用来#define定义后者的除数,这给出了错误的值。

我不知道为什么会发生这种情况,有人可以解释一下为什么我会得到这个结果吗?谢谢。

小智 14

根据定义,define替换引用所在位置的原始代码。#defines 在编译时不断求值之前被替换。所以通过写

#define TEST 20.0 / 65536.0
float e = a/(float) TEST;
Run Code Online (Sandbox Code Playgroud)

它被解释为:

float e = a/(float) 20.0 / 65536.0;
Run Code Online (Sandbox Code Playgroud)

数学上等于 a / 20 / 65536 而不是 / (20 / 65536)。

为了获得您想要的结果,#define 应写为:( #define TEST (20.0 / 65536.0)注意括号)。