我在大学开设了一门课程,解释了如何(以及其他方面)订购数学执行以最大限度地提高精确度并降低在有限精度环境中舍入误差的风险。
我们正在研究一个金融系统,您可以通过常规利息计算等。有人可以分享/提醒我如何构建您的计算以减少精度损失吗?
我知道,例如,必须避免分裂。另外,当你除法时,如果可能的话,首先划分最大的数字。
答案 0 :(得分:5)
数值计算的基本规则是避免减去几乎相等的数字。乘法和除法总是准确的:在执行乘法或除法时,您最多会失去一位精度。但是如果两个数字同意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才能知道哪些是安全的,哪些不是。
答案 1 :(得分:5)
以美分而非美元使用金额。
答案 2 :(得分:3)
精度损失通常与浮点二进制表示的使用有关。金融系统不应使用此类表示,而应使用任意精度数字(例如Java中的BigDecimal和.NET中的十进制)。这应该是你的第一步。
答案 3 :(得分:0)
还可以使用Interval Arithmetic