0

以下のようにSQL関数を書きました

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 の場合は失敗します。私の関数は、Frequency が最大 20K で、Sound が最大値として 100 未満の場合に機能するはずです。T1、T7 を Decimal (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)))))) 

また

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))))))

それはかなりうまく機能し、私の機能よりも正確です。関数のデータ型の必要性をなくすことはできますか? そうでない場合、どのようにして最大の精度を確保できますか?

ありがとう。

4

1 に答える 1

1

入力パラメーターとローカル変数のデータ型としてfloat代わりに使用しますが、これにより、妥当な入力値のオーバーフローが発生することはありません。decimal

于 2013-08-30T08:06:24.740 に答える