C++建议中的舍入错误
rounding error in C++ advice
我正在尝试用C++对一个动态系统进行建模,但在存储值的精度方面存在一些问题。
我读过关于浮点精度的问题,但无法弄清楚我的情况出了什么问题。
所以,问题是关于存储粒子速度。例如,粒子以1.01的速度开始,由于动力学系统的性质,每次相互作用只能增加或减少0.4个单位。
对于前2890次交互,速度值存储良好(完全精确)。在第2891次相互作用时,速度变为
4.209999999999999
而不是
4.21
发生这种情况是因为在那一点上,速度第一次达到"丑陋"的值吗?在2890次互动之后?
对于这个问题,我有两种可能的解决方法,我想征求你的意见。请记住,我需要改变初始速度,而不仅仅是使用1.01。
更改系统的单位,使其在每次交互时获得或失去1.0的速度。(这会起作用吗?例如,如果起始速度为1.21,那么在4.21的值时可能会得到相同的误差?)
每次交互后,将速度四舍五入到固定的小数位数。(我不太喜欢这个,因为我必须提前知道速度的精度,这会使程序更笨拙)
感谢您对此可能的想法。
Iwillnotexist Idonotexist已经在评论中谈到了根本原因。IEEE FP数是二进制分数,4/10不能完美地表示为二进制分数,例如,1/3不能完美地表达为十进制分数。
如果你必须坚持FP表示,并且你愿意更改你使用的值,并且你必须具有完美的准确性,那么就坚持使用二进制分数,这些分数可以表示为1/2、1/4、1/8、1/16等的总和
嗨,,不确定这是否适合你
我有个建议给你。既然你在寻找精度,你可以切换到另一种类型并使用它,而不是双重。在您的情况下,我要做的是创建一个数据结构,以不同的方式表示双值,这样它就可以保持精度。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 在与C 双打中存储的大整数时,如何避免舍入/精确错误
- 如何防止 C++ 中的舍入错误
- C++Visual Studio学习版2012中的舍入错误
- C++建议中的舍入错误
- 使用整数除法减少舍入错误
- 如何修复此舍入错误
- 防止舍入错误
- 浮点-C++浮点舍入(错误?)