我在用户函数中使用SQL Server的POWER函数,当基数为负数且指数为分数时,我收到错误,
[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);
答案 0 :(得分:5)
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甚至不打算试图确定指数是否可以表示为具有奇数分母的分数并抛出错误。
答案 1 :(得分:0)
似乎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。