我一直在努力在一些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
}
有人......请解释一下。感谢。
答案 0 :(得分:2)
2400.000000000
和2399.9998779296875
距离标准float
太近,无法区分它们。试试这个:
#include<iostream>
int main() {
std::cout << (float)2399.9998779296875 << "\n";
}
它可能会将2400
作为输出。
IEEE 754单精度float
只能容纳大约7到8个有效十进制数字。如果您需要更高数量的有效数字,请使用双精度double
。
答案 1 :(得分:2)
在IEEE 754标准中,浮点数在数字轴上不是等距分布的。浮点值的密度在0附近高于2400左右,因此这就是当值大约为2400时进行舍入的原因。