C++:奇怪的浮点数学结果

C++: Strange floating point math results

我一直在努力寻找一些 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.0000000002399.9998779296875 太接近标准 float 无法区分它们。试试这个:

#include<iostream>
int main() {
    std::cout << (float)2399.9998779296875 << "\n";
}

它可能会给出 2400 作为输出。

一个 IEEE 754 单精度 float 只能容纳大约 7 到 8 个有效的小数位。如果您需要更多的有效数字,请使用双精度 double.

在 IEEE 754 标准中,浮点数在数轴上并不是等距分布的。浮点值的密度在 0 附近高于 2400 附近,因此这就是为什么在值在 2400 附近时进行舍入的原因。

这里用图片来说明: https://www.google.fi/search?q=IEEE+754+distribution&biw=1920&bih=895&source=lnms&tbm=isch&sa=X&ved=0ahUKEwj-tKOWkMzPAhUEDywKHRdRAEUQ_AUIBigB#imgrc=rshe5_x1ZXFoKM%3A