C++建议中的舍入错误

rounding error in C++ advice

本文关键字:舍入 错误 C++      更新时间:2023-10-16

我正在尝试用C++对一个动态系统进行建模,但在存储值的精度方面存在一些问题。

我读过关于浮点精度的问题,但无法弄清楚我的情况出了什么问题。

所以,问题是关于存储粒子速度。例如,粒子以1.01的速度开始,由于动力学系统的性质,每次相互作用只能增加或减少0.4个单位。

对于前2890次交互,速度值存储良好(完全精确)。在第2891次相互作用时,速度变为

4.209999999999999

而不是

4.21

发生这种情况是因为在那一点上,速度第一次达到"丑陋"的值吗?在2890次互动之后?

对于这个问题,我有两种可能的解决方法,我想征求你的意见。请记住,我需要改变初始速度,而不仅仅是使用1.01。

  1. 更改系统的单位,使其在每次交互时获得或失去1.0的速度。(这会起作用吗?例如,如果起始速度为1.21,那么在4.21的值时可能会得到相同的误差?)

  2. 每次交互后,将速度四舍五入到固定的小数位数。(我不太喜欢这个,因为我必须提前知道速度的精度,这会使程序更笨拙)

感谢您对此可能的想法。

Iwillnotexist Idonotexist已经在评论中谈到了根本原因。IEEE FP数是二进制分数,4/10不能完美地表示为二进制分数,例如,1/3不能完美地表达为十进制分数。

如果你必须坚持FP表示,并且你愿意更改你使用的值,并且你必须具有完美的准确性,那么就坚持使用二进制分数,这些分数可以表示为1/2、1/4、1/8、1/16等的总和

嗨,,不确定这是否适合你

我有个建议给你。既然你在寻找精度,你可以切换到另一种类型并使用它,而不是双重。在您的情况下,我要做的是创建一个数据结构,以不同的方式表示双值,这样它就可以保持精度。