【问题标题】:Different calculation in SQL Server and ExcelSQL Server 和 Excel 中的不同计算
【发布时间】:2014-07-18 03:48:58
【问题描述】:

这是我的公式。我把它放在一个 SQL Server 存储过程中:

DECLARE @Var01 float
SET @Var01 = 1164.83 * (1 - 3.3387306 * LOG(0.00459418151829729) + 1.426559 * POWER(LOG(0.00459418151829729),2)) / (1 - 3.4680733 * LOG(0.00459418151829729) + 1.8779192 * POWER(LOG(0.00459418151829729), 2) - 0.21223784 * POWER(LOG(0.00459418151829729), 3) - 0.0035814371 * POWER(LOG(0.00459418151829729), 4) - 0.90903163 * POWER(10, -4) * POWER(LOG(0.00459418151829729), 5)) - 459.67

结果是:214.630185149416

那我试着和excel比较一下,公式如下:

=1164.83 * (1 - 3.3387306 * LN(0.00459418151829729) + 1.426559 * (LN(0.00459418151829729)) ^ 2) / (1 - 3.4680733 * LN(0.00459418151829729) + 1.8779192 * (LN(0.00459418151829729)) ^ 2 - 0.21223784 * (LN(0.00459418151829729)) ^ 3 - 0.0035814371 * (LN(0.00459418151829729)) ^ 4 - 0.90903163 * 10 ^ -4 * (LN(0.00459418151829729)) ^ 5) - 459.67

结果是:211.981432072480

问题是,哪一个是正确的?任何的想法?计算有什么不同?

【问题讨论】:

  • LN 用于 Excel,LOG 用于 SQL。
  • 您使用了大量的浮点数,有些是小数点后 17 位。您在浮点运算中失去了精度,如果不检查,我会说 SQL 和 Excel 提供的精度不同,这就是您得到差异的原因。
  • @All,那我该怎么办?
  • @nawazlj 请阅读 Excel 的 LN() 和 Sql Server 的 LOG() 的文档。你会发现它们都是自然对数。
  • @Haminteu 哦,天哪,我想我会投给 SQL Server。默认情况下,IIRC float 表示 float(53),比 Excel 精确得多。你也可以试试 Wolfram Alpha 看看你得到了什么,但由于大小限制,你必须将你的公式分成几个块。不过,我对此没有足够的信心来提供答案。希望其他人可以过来确认。

标签: sql excel sql-server-2008 math excel-2010


【解决方案1】:

cmets 推测这是舍入错误,并且 SQL Server 更可靠,因为它使用比 Excel 更精确的浮点数。这是错误的。相对误差约为 1%。除非您减去几乎相等的大数字,否则当您执行短计算而产生 10-13% 的舍入误差时,您不会得到 1% 的相对误差。

我建议分解计算,看看 SQL Server 和 Excel 是否在这些部分上达成一致,看看它们在哪里分歧。这本来可以的。这就像单步执行一个程序,而不是仅仅说最终结果不是我们想要的。您可以进行二进制搜索以快速找到问题,但 OP 没有提供任何其他信息。

正在执行的计算是

没有任何可能导致较大相对误差的巨大数字的取消。所以,我试图解决

看看分母中有什么错误会导致这种错误计算。通过一点微积分,我可以检查常量中的拼写错误。解是 x=-0.410829。这几乎是分母中的最后一项。所以,答案不是这些环境之一在简单的浮点计算中产生 1% 的相对误差,而是分母中去掉了一个术语。如果将计算分解成碎片,这一点就很明显了。

最后一个词是唯一一个像 POWER(10,-4) 这样的词。难道这是使用整数运算而不是浮点数来执行的,因此它的计算结果为 0 而不是 0.0001?是的,apparently that's what SQL Server does。这就像整数算术中的 1/2=0。如果你想要一个十进制输出,你必须给它一个十进制输入。将 10 转换为十进制,将其更改为 POWER(10.0,-4),使用 0.0001,或者对整个系数使用适当的科学记数法。

【讨论】:

  • 天哪,SO 上没有 LaTeX 支持,只有其他 StackExchange 站点上。我将对其进行编辑以使方程式可读。
  • Mathematica 和 Math 站点是唯一支持 LaTex、AFAIK 的站点。
  • 好的,看起来像 Physics 和 CompSci 网站也有。所以大多数硬科学网站。
  • 是的,我怀疑 SQL Server 使用最小/最低精度数据类型的做法是问题所在,该数据类型可以保持字面常量而不会造成印刷精度损失,但不确定它在哪里。很好地找到它。
  • @Haminteu:当您编写@myNumber=POWER(2,0.5) 时,我认为右侧首先被评估为整数,1,然后转换为浮点数。为避免使用整数运算,我认为您应该改用 @myNumber=POWER(2.0,0.5)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多