我经历了一个非常奇怪的行为(对我而言):

    int generate_scenario_one_pass(FILE *out, double freq_mhz) {
        unsigned int d_freq, d_freq_test;
        d_freq              = (int)(freq_mhz * 20);
        d_freq_test         = (int)(float)(freq_mhz * 20);
        printf("when freq_mhz = %.1f, d_freq = 0x%04X, d_freq_test = 0x%04X\n", freq_mhz, d_freq, d_freq_test);
    }

整个代码不在这里,但是不相关。从2110.0开始,以0.1为增量,以增加的值多次调用此函数。
when freq_mhz = 2110.0, d_freq = 0xA4D8, d_freq_test = 0xA4D8
when freq_mhz = 2110.1, d_freq = 0xA4DA, d_freq_test = 0xA4DA
when freq_mhz = 2110.2, d_freq = 0xA4DC, d_freq_test = 0xA4DC
when freq_mhz = 2110.3, d_freq = 0xA4DD, d_freq_test = 0xA4DE

在最后一次迭代中,d_freq是错误的!但是d_freq_test具有正确的值。所以我的问题通过从double转换为float,然后从float转换为int得以解决。我想知道为什么。

这是在x86 CPU上使用MSVC++ 6.0编译的。

最佳答案

有许多数字无法精确地表示为浮点数-其中有0.1(将四舍五入到可以表示的最接近的数字-类似于0.0999999999999998)。当使用double时,2110.3恰好由一个比2110.3稍小的数字表示,因此当您乘以20并强制转换为int(将四舍五入)时,将给出“错误”结果,而将2110.3表示为浮点数比2110.3大一点的数字,从而给出了预期的结果。

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

10-17 00:20