我一直在努力寻找一些C ++代码中的疯狂错误,并将其缩小到这一小部分。我放入一个简单的main.c中进行调试,无法弄清楚为什么浮点数学在不应该进行舍入时会四舍五入。
// setup the variables for this simple case
int writep = 672;
float offset = 672.000122;
int bufferSize = 2400;
float bufferSizeF = (float)bufferSize;
float outPointer = (float)writep - offset; // outPointer: -0.000122070313
if(outPointer < 0.0f){
printf("outPointer: %.9f \n", outPointer); // outPointer: -0.000122070313
outPointer += bufferSizeF; // outPointer SHOULD be: 2399.9998779296875
printf("outpointer: %.9f \n", outPointer); // outPointer: 2400.000000000
}
有人...请解释。谢谢。
最佳答案
2400.000000000
和2399.9998779296875
太接近以至于标准float
无法区分它们。尝试这个:
#include<iostream>
int main() {
std::cout << (float)2399.9998779296875 << "\n";
}
它可能会给出
2400
作为输出。IEEE 754单精度
float
只能容纳大约7到8个有效十进制数字。如果需要更多有效数字,请使用双精度double
。关于c++ - C++:奇怪的浮点数学结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39937354/