SQL Server和Excel中的不同计算

时间:2014-07-18 03:48:59

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

这是我的公式。我把它放在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

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

1 个答案:

答案 0 :(得分:4)

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

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

正在执行的计算是

1164.83\frac{1+17.9723+41.3364}{1+18.6685+54.4152+33.1045-3.00707+0.410853} - 459.67

= 1164.83 \frac{60.3087}{104.592}-459.67

=211.981

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

1164.83 \frac{60.3087}{104.592+x}-459.67 = 214.630185149416

看看分母中的哪个错误会导致这个错误估算。通过一点微积分,我可以检查常量中的拼写错误。解决方案是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,或对整个系数使用适当的科学记数法。