计算平均重量时的数字误差很小
Small numerical error when calculating Weight Average
这是物理引擎的一部分。
简化函数centerOfMass
计算两个刚体的一维质心(演示):-
#include <iostream>
#include <iomanip>
float centerOfMass(float pos1,float m1, float pos2,float m2){
return (pos1*m1+pos2*m2)/(m1+m2);
}
int main(){
float a=5.55709743f;
float b= centerOfMass(a,50,0,0);
std::cout << std::setprecision(9) << a << 'n'; //5.55709743
std::cout << std::setprecision(9) << b << 'n'; //5.55709696
}
我需要b
精确= 5.55709743。
有时(我的真实情况= 5%),微小的差异会引入令人讨厌的物理分歧。
有一些方法可以解决它,例如大量进行一些条件检查。
但是,这对我来说非常容易出错。
问题:如何在保持代码干净、快速且易于维护的同时解决计算错误?
顺便说一句,如果不能优雅地完成,我可能需要改进调用者以更好地抵抗这种数字错误。
编辑
(澄清重复问题)
是的,原因是存储/计算格式的精度错误(浮点数学是否损坏?
但是,这个问题询问如何在非常特殊的情况下中和其症状。
您正在尝试获取 9 个十进制数字的精度,但数据类型float
的精度约为 7 个十进制数字。
请改用double
。(演示)
使用双精度,而不是浮点数。 IEEE 754 双精度具有大约 16 位小数的精度。
#include <iostream>
#include <iomanip>
double centerOfMass(double pos1, double m1, double pos2, double m2) {
return (pos1*m1 + pos2 * m2) / (m1 + m2);
}
int main() {
double a = 5.55709743;
double b = centerOfMass(a, 50, 0, 0);
std::cout << std::setprecision(16) << a << 'n'; //5.55709743
std::cout << std::setprecision(16) << b << 'n'; //5.55709743
std::cout << std::setprecision(16) << (b - a) << 'n'; // 0
}
对于给出的示例 centerOfMass(a, 50, 0, 0),下面将给出 a 的所有值的精确结果,但当然该示例看起来并不现实。
double centerOfMass(double pos1, double m1, double pos2, double m2) {
double divisor = m1 + m2;
return pos1*(m1/divisor) + pos2*(m2/ divisor);
}
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 为什么在浮点中从大到小会引入更多的误差
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- 计算平均重量时的数字误差很小
- 是否存在两个相乘(或除)的数字会引入误差?
- 数字误差的质因数分解
- 误差C++舍入数字 - 表达式必须具有整数或枚举类型
- c++中数字的n次方根的精度误差