【问题标题】:Error using power function when the base is negative and exponent is fractional当底数为负且指数为小数时使用幂函数出错
【发布时间】:2015-01-14 17:34:49
【问题描述】:

我在用户函数中使用 SQL Server 的 POWER 函数,当底数为负数且指数为小数时,我遇到了错误,

[MICROSOFT][ODBC SQL SERVER DRIVER][SQL SERVER]发生了无效的浮点操作。

在现实世界中可以将负基数提升为幂,所以这是 SQL 错误吗?如果是这样,有解决办法吗?

例子:

SELECT POWER(-.2, 9.7)

问题的进一步细化

-- These work
SELECT 
    POWER(-.2, 9)
,   POWER(.2, 9.7);

-- This does not
SELECT
    POWER(-.2, 9.7);

-- POWER on BOL http://msdn.microsoft.com/en-us/library/ms174276.aspx
-- Returns the same type as submitted in float_expression
-- Perhaps something is awry with typing
DECLARE
    @f decimal(35,30) = -.2
,   @fout decimal(35,30);

-- This still fails with "An invalid floating point operation occurred"
SELECT
    @fout = POWER(@f, 9.7);

【问题讨论】:

  • SQL_Server 实现很好。 windows 计算器坏了。
  • FWIW,Windows 7 上的计算器给出“无效输入”错误。
  • 过失,我编辑了问题并添加了进一步的细化部分,其中包括 windows 计算器行。 @DStanley 我也失败了 Windows 计算器,因为它将 - 应用于 .2^9.7 的结果

标签: sql sql-server


【解决方案1】:

POWER(-.2, 9.7) 的结果最多只能是一个虚数,不能表示为单个浮点数。

可以将浮点指数转换为分数,并将其重写为POWER(-.2,97/10),相当于POWER(POWER(-.2,97) , 1/10)。由于负数的第 N 个根在 N 为奇数时为实数,而在 N 为偶数时为虚数,POWER(-.2,1/10) 将是一个复数。

请注意,POWER(-.2, 0.8) 可以 被评估为一个实数,因为它只相当于 POWER(-.2,4/5) 并且 -.2 的第 5 个根是实数,但我的猜测是 SQL 不'甚至不用费心去确定指数是否可以表示为一个分母为奇数的分数并引发错误。

【讨论】:

  • 我相信将小数转换为分数是正确的解决方法。这不再是一个问题,因为决定重新编写函数。自从首次编写此函数以来,已经创建了一种更准确的获取数字的方法。
【解决方案2】:

似乎 SQL Server 只是不允许您对负基数进行小数指数运算。

这里有一些讨论:Raising numbers to fractional powers in SQL

我做了一些测试,只是想看看什么有效,什么无效,使用这个查询:

create table #test(b float, val float, success bit default (0));

    declare @a float = -1, @b decimal(3,2) = 0.01

    WHILE @b < 2
    BEGIN
        INSERT INTO #test(b) VALUES(@b);

        BEGIN TRY
            UPDATE #test SET val = POWER(@a, @b), success = 1 WHERE b = @b
        END TRY
        BEGIN CATCH
            PRINT @@error
        END CATCH

        SELECT @b += .01;
    END

    select * from #test

如果您注意到,即使是应该可以工作而不会给出复数错误的步骤。唯一能正常工作的结果是 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多