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

时间:2016-10-08 21:04:12

标签: c++ floating-point rounding

我一直在努力在一些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
}

有人......请解释一下。感谢。

2 个答案:

答案 0 :(得分:2)

2400.0000000002399.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时进行舍入的原因。

以下是图片说明: 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

相关问题