- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看 arcsin
的运行时库实现这是通过计算实现的:
ArcTan(X, Sqrt(1 - X*X))
1 - X*X
的代码实际评估
(1-X)*(1+X)
.选择后者有充分的理由吗?我怀疑后者会降低
X
的舍入误差接近于零,但我无法解释为什么会这样。
最佳答案
ArcTan(X, Sqrt(1-X*X))
的导数相对于 X 是 1/Sqrt(1-X*X)
.这趋于无穷大为 |X|变为 1。因此,当 X 接近 1 或 -1 时,评估中的任何错误都会对结果产生巨大影响。因此,在这些情况下,评估最小化错误是至关重要的。
当 X 接近 1 时,1-X
的评估没有错误(在 IEEE 754 或任何好的浮点系统中,因为结果的标度使得其最低有效位至少与 1 或 X 中的最低有效位一样低,因此精确的数学结果没有可用有效位之外的位)。自 1-X
是准确的,请考虑 1+X
中错误的影响通过考虑 ArcTan(X, Sqrt((1-X)*(1+X+e))
的导数关于 e,其中 e 是 1+X
中引入的误差手术。当 X 接近 1 且 e 很小时,导数约为 -1/10。 (用 Maple 求导并用 1 代替 x 产生 -1/(sqrt(4+2e)*(5+2e)
。然后用 0 代替 e 产生 -1/10。)因此,1+X
中的误差不重要。
因此,将表达式计算为 ArcTan(X, Sqrt((1-X)*(1+X))
是一个很好的评价方式。
对于接近 -1 的 X,情况是对称的。 ( 1+X
没有错误,1-X
不是关键。)
相反,如果我们考虑 X*X
中的错误,ArcTan(X, Sqrt(1-X*X+e))
的导数关于e是,当X接近1时,大约是-1/(2sqrt(e)(1+e)),所以当e小时它就大。所以在评估 X*X
时有一个小错误当 X 接近 1 时,会导致结果出现较大误差。
Ask Pascal Cuoq 指出,在评估函数 f(x) 时,我们通常对最小化最终结果中的相对误差感兴趣。而且,正如我所指出的,计算过程中出现的错误通常是由于浮点舍入导致的中间结果中的相对错误。我能够在上面忽略这一点,因为我正在考虑 X 接近 1 时的函数,因此所考虑的中间值(1+X 和 X*X)和最终值的幅度都接近 1,因此将这些值相除那些幅度不会有任何显着变化。
但是,为了完整起见,我更仔细地检查了情况。在Maple,我写了g := arctan(x, sqrt((1-x*x*(1+e0))*(1+e1))*(1+e2))
,因此在 x*x
的计算中允许相对误差 e0、e1 和 e2 , 1-x*x
,以及 sqrt
分别和我写了h:= arctan(x, sqrt((1-x)*(1+x)*(1+e0))*(1+e2))
对于替代方案。请注意,在这种情况下,e0 结合了 1-x
中的三个错误。 , 1+x
,以及它们的乘法;完整的错误项可能是 (1+ea)*(1+eb)*(1+ec)
,但这实际上是 1+e0
e0 的可能范围更大。
然后我检查了这些函数关于(一次一个)e0、e1 和 e2 除以 abs(f(x)) 的导数,其中 f
是理想的功能,arctan(x, sqrt(1-x*x))
.例如,在 Maple 中,我检查了 diff(g, e0) / abs(f(x))
.我没有对这些进行全面的分析评估;我检查了一些接近 0 和接近 1 的 x 值以及 e0、e1 和 e2 在它们的极限之一 -2-54 处的值。
对于接近 0 的 x,这些值的大小都约为 1 或更小。也就是说,计算中的任何相对误差都会导致结果中的相对误差类似或更少。
对于接近 1 的 x,e1 和 e2 的导数的值很小,大约为 10-8 或更小。然而,这两种方法的 e0 导数的值有很大的不同。对于 1-x*x
方法,该值约为 2•107(使用 x = 1-2-53)。对于 (1-x)*(1+x)
方法,该值约为 5•10-9。
综上所述,这两种方法在 x = 0 附近差别不大,但 (1-x)*(1+x)
方法在 x = 1 附近明显更好。
关于floating-point - 为什么 (1-x)(1+x) 比 (1-x^2) 更受欢迎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20764836/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!