2013-08-30 65 views
0

我只是寫了一個SQL函數如下SQL UDF:浮點錯誤

Create Function LAeq(@Frequency Decimal(18,2), @Sound Decimal(18,2)) 
RETURNS DECIMAL(18,2) 
AS 
BEGIN 
declare @T1 Decimal (28, 10) 
DECLARE @T2 Decimal (28, 10) 
DECLARE @T3 Decimal (28, 10) 
DECLARE @T4 Decimal (28, 10) 
DECLARE @T5 Decimal (28, 10) 
DECLARE @T6 Decimal (28, 10) 
DECLARE @T7 Decimal (28, 10) 

SET @T1 = POWER(12200.0,2) * POWER(@Frequency, 4) 
SET @T2 = POWER (@Frequency, 2) + POWER(20.6,2) 
SET @T3 = POWER (@Frequency, 2) + POWER(107.7,2) 
SET @T4 = POWER (@Frequency, 2) + POWER(737.9,2) 
SET @T5 = POWER (@Frequency, 2) + POWER(12200.0,2) 
SET @T6 = SQRT(@T3 *@T4) * @T5 * @T2 
SET @T7 = @T1/ @T6 
SET @T7 = @Sound + (2.0 + (20.0 * LOG10(@T7))) 
RETURN @T7 
END 

如果我通過價值0.8此功能,26然而,當我有一樣的值20000,80我的函數應該失敗頻率最大爲20K,聲音可以小於100最大值。我嘗試將T1,T7從十進制(28,10)更改爲30,15或18,2,但對我來說沒有任何作用。我不想定義數據類型的限制,當我寫了一個SQL語句相同的公式

Select 26 + (2 + (20 * LOG10((POWER(12200,2) * POWER(0.8, 4))/ (SQRT((POWER (0.8, 2) + POWER(107.7,2)) * (POWER (0.8, 2) + POWER(737.9,2))) * (POWER (0.8, 2) + POWER(12200,2)) * (POWER (0.8, 2) + POWER(20.6,2)))))) 

OR

Select 80 + (2 + (20 * LOG10((POWER(12200,2) * POWER(20000.00, 4))/ (SQRT((POWER (20000.00, 2) + POWER(107.7,2)) * (POWER (20000.00, 2) + POWER(737.9,2))) * (POWER (20000.00, 2) + POWER(12200,2)) * (POWER (20000.00, 2) + POWER(20.6,2)))))) 

它非常細,比我的功能更加準確。我可以在功能上消除數據類型的需要嗎?如果不能如何確保最大精度?

謝謝。

回答

1

我會使用float而不是decimal作爲輸入參數和局部變量的數據類型,這不會導致合理輸入值的溢出。

+0

儘管它使我的極端情況起作用,但與直接SELECT方法相比,它仍然不是很準確。但我認爲我現在可以忍受它。 –