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.000000000
和 2399.9998779296875
太接近标准 float
无法区分它们。试试这个:
#include<iostream>
int main() {
std::cout << (float)2399.9998779296875 << "\n";
}
它可能会给出 2400
作为输出。
一个 IEEE 754 单精度 float
只能容纳大约 7 到 8 个有效的小数位。如果您需要更多的有效数字,请使用双精度 double
.
在 IEEE 754 标准中,浮点数在数轴上并不是等距分布的。浮点值的密度在 0 附近高于 2400 附近,因此这就是为什么在值在 2400 附近时进行舍入的原因。
我一直在努力寻找一些 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.000000000
和 2399.9998779296875
太接近标准 float
无法区分它们。试试这个:
#include<iostream>
int main() {
std::cout << (float)2399.9998779296875 << "\n";
}
它可能会给出 2400
作为输出。
一个 IEEE 754 单精度 float
只能容纳大约 7 到 8 个有效的小数位。如果您需要更多的有效数字,请使用双精度 double
.
在 IEEE 754 标准中,浮点数在数轴上并不是等距分布的。浮点值的密度在 0 附近高于 2400 附近,因此这就是为什么在值在 2400 附近时进行舍入的原因。