我收到的最近的家庭作业要求我们采取表达式,这些表达式可能会在计算机中执行时造成精度损失,并对其进行更改以避免这种损失.
不幸的是,这样做的方向尚未明确.通过观察正在执行的各种示例,我知道有一些方法可以做到这一点:使用泰勒级数,如果涉及平方根则使用共轭,或者在减去两个分数时找到共同的分母.
但是,我很难注意到何时会发生精度损失.到目前为止,我唯一确定的是,当你减去两个接近相同的数字时,由于高阶数字很重要,你会失去精确度,而你会因为四舍五入而失去精确数字.
我的问题是我应该寻找的其他常见情况,以及接近它们的"好"方法是什么?
例如,这是一个问题:
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)几乎相同.我不明白为解决这个问题,这些算法中的任何一个或更好的方式或原因.
通常使用的另一个经验法则是:当添加一长串数字时,开始从最接近零的数字添加并以最大数字结束.
解释为什么这是好的是abit棘手.当你为一个大数字添加小数字时,它们有可能被完全丢弃,因为它们小于当前大数字尾数中的最小数字.比如这种情况:
a = 1,000,000; do 100,000,000 time: a += 0.01;
如果0.01小于最低的尾数,那么循环什么都不做,最终结果是== 1,000,000,但如果你这样做:
a = 0; do 100,000,000 time: a += 0.01; a += 1,000,000;
比较低的数字慢慢增长,你更有可能最终得到接近== 2,000,000的东西,这是正确的答案.
这是一个极端的例子,但我希望你能得到这个想法.