奇怪的浮点数学结果
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附近时进行舍入。
下面是图片来说明它: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 %
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 如果偶数浮点数(分数数)的模数为 2,那么它不会给出'0'结果!在C++
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 浮点数的机器表示不是我预期的结果
- C++ to_string函数根据额外打印语句的先见之明,为浮点数和整数转换提供不同的结果
- 为什么整数/浮点数乘法会导致不同的结果
- 划分两个浮点数不会给出确切的结果
- 具有和不具有SSE(浮点数组乘法)的不同结果
- 用c++把两个浮点数相乘得到的结果是非数字的
- 输入第一个浮点数后出现奇数结果
- 浮点数和由于舍入行为导致的不正确结果
- 整数和浮点数之间的加法…结果是0
- 如何在x86汇编中移动两个浮点数的结果
- 我试图访问浮点数中的单个字节,我得到了意想不到的结果
- 为了得到最精确的结果,应该按哪个顺序添加浮点数
- 有可能的方法可以将两个从无符号 int 铸造的浮点数除以产生负浮点数结果
- 如何将浮点数与 int 正确相乘并获得仅受有效数字影响的结果