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

关于c++ - C++:奇怪的浮点数学结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39937354/

10-11 14:20