我经历了一个非常奇怪的行为(对我而言):
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/