Sql 当基数为负且指数为分数时,使用幂函数时出错

Sql 当基数为负且指数为分数时,使用幂函数时出错,sql,sql-server,Sql,Sql Server,我在用户函数中使用SQL Server函数,当基数为负数且指数为分数时,我得到一个错误 [MICROSOFT][ODBC SQL SERVER驱动程序][SQL SERVER]发生无效的浮点操作 在现实世界中,负基数可以提升为幂,那么这是SQL错误吗?如果是这样,是否有解决办法 例如: SELECT POWER(-.2, 9.7) 进一步完善该问题 -- These work SELECT POWER(-.2, 9) , POWER(.2, 9.7); -- This does

我在用户函数中使用SQL Server函数,当基数为负数且指数为分数时,我得到一个错误

[MICROSOFT][ODBC SQL SERVER驱动程序][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);
幂-2,9.7的结果充其量是一个虚数,不能表示为一个浮点数

您可以将浮点指数转换为分数,并将其重写为幂-.2,97/10,这相当于幂-.2,97,1/10。因为如果N是奇数,负数的N根是实数,如果N是偶数,则N根是虚数,因此幂-.2,1/10将是复数

请注意,幂-0.2,0.8可以作为实数计算,因为它只相当于幂-0.2,4/5,-.2的第五个根是实数,但我的猜测是SQL甚至不会费心去确定指数是否可以表示为具有奇数分母的分数并抛出错误。

幂-0.2,9.7的结果是,充其量是一个虚数,不能表示为一个浮点数

您可以将浮点指数转换为分数,并将其重写为幂-.2,97/10,这相当于幂-.2,97,1/10。因为如果N是奇数,负数的N根是实数,如果N是偶数,则N根是虚数,因此幂-.2,1/10将是复数


注意,幂-.2,0.8可以作为实数计算,因为它只相当于幂-.2,4/5,-.2的第5个根是实数,但我的猜测是,SQL甚至不会费心去确定指数是否可以表示为具有奇数分母的分数,并抛出一个错误。

SQL Server似乎不允许您对负数进行分数指数

这里有一些讨论:

我使用以下查询进行了一些测试,以查看哪些有效,哪些无效:

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。

SQL Server似乎不允许对负数进行分数指数运算

这里有一些讨论:

我使用以下查询进行了一些测试,以查看哪些有效,哪些无效:

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。

SQL\u Server实现很好。windows计算器已损坏。FWIW,windows 7上的计算器出现无效的输入错误。我编辑了问题并添加了进一步的细化部分,其中包括windows计算器行@DStanley I也未能通过windows calculator,因为它将-应用于.2^9.7的结果。SQL_Server实现很好。windows计算器已损坏。FWIW,windows 7上的计算器出现无效的输入错误。我编辑了问题并添加了进一步的细化部分,其中包括windows计算器行@DStanley我也没有通过windows计算器,因为它将-应用于.2^9.7的结果。我相信将小数转换为小数是正确的解决方法。这不再是一个问题,因为已经决定重新编写函数。由于这个函数是第一次编写的,因此创建了一种更精确的获取数字的方法。我相信将小数转换为小数是正确的解决方法。这不再是一个问题,因为已经决定重新编写函数。自从该函数首次编写以来,就创建了一种更精确的获取数字的方法。