【问题标题】:Floating Point; Division vs Multiplication浮点;除法与乘法
【发布时间】:2015-01-29 18:15:34
【问题描述】:

你有两个功能;

f(x)= x(((x+1)^(1/2))-(x^(1/2)))    
g(x)= x/(((x+1)^(1/2))+(x^(1/2)))

哪个更准确?

旁注:如果你能解释原因,那真的对我有帮助,我感觉它是 f(x),因为没有分母,但我不是 100% 确定。

【问题讨论】:

  • 太离题了,试试math.stackexchange吧。
  • 您好 Claire,StackExchange 分为多个页面,专注于不同的主题。其中之一是Mathematics。你应该在那里问你的问题。
  • @ClaireBlackman:在有限精度浮点算术中求值时,数学上等价的表达式很少等价;看我的回答。
  • @TheBlueDog 在数学上,这些是相同的。 math.se 将在那时停止关心。 OP 的问题是,在使用浮点运算进行评估时,哪一个受舍入误差的影响较小。我不明白这怎么会是这样。
  • OP 转发到mathematica.stackexchange.com/q/72801(这仍然与 math.se 不同,我仍然会说这个问题最适合 SO)。

标签: math floating-point


【解决方案1】:

浮点运算与真正的数学有很大不同。特别是,浮点运算不是关联的或分配的。因此,当用有限精度浮点算术求值时,数学上等价的表达式不一定是等价的。即使按照IEEE-754 floating-point standard 的要求,单独的运算(例如加法、减法、乘法、除法和平方根)产生正确的舍入结果也是如此。

在这种情况下,g() 将比f() 更准确,对于x = 500 的特定情况也是如此。原因是f() 遭受了减法抵消。这发生在两个大小几乎相同的浮点数的有效减法中。在减法过程中,前导数字取消,只留下几个剩余的尾随数字进入后续计算。此外,在被减去的原始操作数的尾随数字中累积的任何舍入误差可能会被后续计算放大。可以在this Wikipedia article 中找到带有示例的扩展说明。

在这种情况下,sqrt(x+1)sqrt(x) 的幅度几乎相同,尤其是随着 x 幅度的增加。以x = 500为例,采用IEEE-754单精度算法,我们发现:

x = 500   f(x) = 0x1.659ae0p+3 (11.175156)   reference = 0x1.659798p+3 (11.174755)
x = 500   g(x) = 0x1.659798p+3 (11.174755)   reference = 0x1.659798p+3 (11.174755)

f(500) 中的误差为 420 ulps,而g(500) 提供正确舍入的单精度结果。

【讨论】:

  • 出于好奇,是否存在f 更准确的值?不只是“平均”?
  • OT:奇怪的是我的回答自动变成了社区维基。 @Teepeemm:是的,通过对随机 IEEE-754 单精度参数的粗略检查,存在许多此类情况。例如:x=0x1.6fa276p-2 (3.59018177e-1); f(x)=0x1.a09844p-3 (2.03415424e-1); g(x)=0x1.a09846p-3 (2.03415439e-1); ref=0x1.a09844p-3 (2.03415425e-1); ulperr(f)=6.71231e-2; ulperr(g)=9.32877e-1
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2023-03-25
  • 2014-02-14
  • 2013-07-26
相关资源
最近更新 更多