奇怪的浮点数学结果

C++: Strange floating point math results

本文关键字:结果 浮点数      更新时间:2023-10-16

我一直在努力寻找一些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&车身= 1920,波黑= 895,来源= lnms& tbm = isch& sa = X& ved = 0 ahukewj-tkowkmzpahuedywkhrdraeuq_auibigb 3 # imgrc = rshe5_x1ZXFoKM %