precision - 避免精度损失的最佳算法?

标签 precision numerical-analysis

我最近收到的一项家庭作业要求我们采用在计算机中执行时可能会造成精度损失的表达式,并对其进行更改以避免这种损失。

不幸的是,执行此操作的指示尚未非常明确。通过观察各种正在执行的示例,我知道有一些方法可以做到这一点:使用泰勒级数,如果涉及平方根则使用共轭,或者在两个分数相减时找到公分母。

但是,我很难准确地注意到何时会发生精度损失。到目前为止,我唯一确定的是,当您减去两个接近相同的数字时,会发生精度损失,因为高位数字很重要,并且您会因四舍五入而丢失这些数字。

我的问题是我应该寻找哪些其他常见情况,以及什么被认为是解决这些问题的“好”方法?

例如,这里有一个问题:

f(x) = tan(x) − sin(x)  when x ~ 0

从这三个选择中评估此问题的最佳和最差算法是什么:

(a) (1/ cos(x) − 1) sin(x),
(b) (x^3)/2
(c) tan(x)*(sin(x)^2)/(cos(x) + 1).

我知道当 x 接近于零时,tan(x) 和 sin(x) 几乎相同。我不明白这些算法如何或为何在解决问题方面更好或更差。

最佳答案

通常使用的另一个经验法则是:当添加一长串数字时,从最接近零的数字开始添加,并以最大的数字结束。

解释为什么这很好有点棘手。当您将小数字添加到大数字时,它们有可能被完全丢弃,因为它们小于大数字当前尾数中的最低数字。以这种情况为例:

a = 1,000,000;
do 100,000,000 time:
   a += 0.01;

如果 0.01 小于最低尾数,则循环不执行任何操作,最终结果为 a == 1,000,000 但如果你这样做:

a = 0;
do 100,000,000 time:
   a += 0.01;
a += 1,000,000;

随着较低的数字慢慢增长,您最终更有可能得到接近 == 2,000,000 的值,这是正确的答案。
这当然是一个极端的例子,但我希望你能明白。

关于precision - 避免精度损失的最佳算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502122/

相关文章:

iOS 7.1 CommonCrypto 库提示 : Implicit conversion loses integer precision: 'NSUInteger' (unsigned long) to CC_LONG (unsigned int)

math - float 学有问题吗?

java - 现代计算机上的二进制 GCD 算法与欧几里得算法

python - 具有非常量质量矩阵的非线性微分方程的解

python - Python 中多元 5 次多项式回归的曲面图

python - 为什么在 Pi 的整数倍处 torch.sin() 和 numpy.sin() 的评估存在数量级?

visual-studio - 为什么Visual Studio 2008会告诉我.9-.8999999999999995 = 0.00000000000000055511151231257827?

mysql - 存储经度和纬度值需要哪种数据类型

matrix - C++ 稀疏矩阵库

computational-geometry - 由坐标集定义的区域的数值积分?