我在大学里学过一门课程,它解释了在有限精度的环境中,如何(以及其他事情)如何排序你的数学执行,以最大限度地提高精度并减少舍入误差的风险。
我们正在用你通常的利息计算和诸如此类的金融系统工作。有人能分享/提醒我如何组织你的计算,以最大限度地减少精度损失吗?
例如,我知道必须避免分裂。此外,当你除法时,如果可能的话,首先除以最大的数字。
发布于 2010-10-19 21:59:10
数值计算的基本规则是避免减去几乎相等的数字。乘法和除法总是准确的:在执行乘法或除法时,最多只能损失一位的精度。但是,如果两个数字的n位一致,那么在它们的减法中,您可能会损失高达n位的精度。
有各种各样的技巧可以避免这样的减法。例如,假设您需要为x的较小值计算exp(x) -1。(这是您在计算利息时可能要做的事情)。如果x非常小,以至于exp(x)等于计算机的所有精度的1,那么减法将恰好得到0,由此产生的相对误差将为100%。但是如果你使用泰勒近似exp(x) -1=x+ x^2/2 + ...你可以得到一个更准确的答案。例如,exp(10^-17) -1将完全不准确,但10^-17,单项泰勒近似,将非常精确。这就是像expm1
这样的函数的工作方式。请参阅log1p
和expm1
here的说明。
如果你关心数值的准确性,你需要理解anatomy of floating point numbers,以便知道什么是安全的,什么是不安全的。
发布于 2010-10-19 22:00:41
使用以美分为单位的金额,而不是美元。
发布于 2010-10-19 22:01:06
精度损失通常与浮点二进制表示的使用有关。金融系统不应该使用这种表示形式,而应该使用任意精度的数字(比如Java语言中的BigDecimal和.NET语言中的decimal )。这应该是你的第一步。
https://stackoverflow.com/questions/3969038
复制相似问题