0

この階乗を ErlangC 関数で使用しようとしています。しかし、私のエージェントの数は 300 に達する可能性があります。これにより、かなりの数を取得できます。たとえば。_ 私の質問は、これらの数値をどのように保存して計算するのですか? ネイティブ SQL に方法はありますか。私は CLR に行って外部関数を作成できることを知っています。しかし、簡単にするために、このネイティブ SQL を保持したいと思います。本当にここから 9 と 10 に到達しようとしています。しかし、私がこれを解決するとき、私はそれを成し遂げます。ご提供いただけるご支援をよろしくお願いいたします。

ALTER FUNCTION [dbo].[Factorial] ( @iNumber int )
    RETURNS float
    AS
    BEGIN

    Declare @i float
        IF @iNumber <= 1
            SET @i = 1    
        ELSE
            SET @i = @iNumber
            WHILE @iNumber > 1
            BEGIN

            SET @i = @i * (@iNumber - 1)
                Set @iNumber = @iNumber -1 
            END

    RETURN (@i)
    END

ErlangC コードは次のとおりです。

ALTER FUNCTION [AMS].[ErlangC]
(
    -- Add the parameters for the function here
    @m float  -- Number of Agents
    ,@u float -- Traffic floatensity
)
RETURNS float
AS
BEGIN
--Source http://www.mitan.co.uk/erlang/elgcmath.htm Number 6

    -- Return Variable
    DECLARE @Prob Float -- Probability of Call not being answered immediately and having to wait.

    -- Variables
    Declare @Numerator Float -- Top of Equation
    Declare @Denominator Float -- Bottom of Equation
    Declare @Summation float -- Summation part of Denominator
    Declare @k float    -- increment for summation


    --Calculate Numerator

    SET @Numerator = Power(@u,@m)/dbo.Factorial(@m) 

    -- Start Summation with k starting at 0.
    SET @k = 0
    SET @Summation = 0

    While @k < @m-1
    Begin
        SET @Summation = @Summation + Power(@u,@k)/dbo.Factorial(@k)
        SET @k = @k +1
    End

    --Calculate denominator

    SET @Denominator = Power(@u,@m)/dbo.Factorial(@m) + (1-@u/@m)*@Summation

    SET @Prob = @Numerator/@Denominator

    -- Return the result of the function
    RETURN @Prob

END
4

1 に答える 1

1

まあ、私は他の誰かのコードを見つけましたが、それは機能します...しかし、理由はわかりません..基本的に、階乗を行う代わりに、対数を使用して累乗と階乗を一緒に行い、指数関数的に数値を乗算した場合と同じ数値を取得します.

ALTER FUNCTION [dbo].[PowerFactorial] ( @m float,  @u float)
RETURNS float
AS
BEGIN

Declare @counter float --counter
Declare @total float -- return value

SET @counter = 1
SET @total = 0

WHILE @counter <= @u
BEGIN

SET @total = @total + Log(@m/@counter)
    Set @counter= @counter + 1

END

RETURN Exp(@total)
END

ErlangC をこれに変更します。

ALTER FUNCTION [AMS].[ErlangC]
(
    -- Add the parameters for the function here
    @m float  -- Number of Agents
    ,@u float -- Traffic intensity
)
RETURNS float
AS
BEGIN
--Source http://www.mitan.co.uk/erlang/elgcmath.htm Number 6

    -- Return Variable
    DECLARE @Prob Float -- Probability of Call not being answered immediately and having to wait.

    -- Variables
    Declare @Numerator Float -- Top of Equation
    Declare @Denominator Float -- Bottom of Equation
    Declare @Summation float -- Summation part of Denominator
    Declare @k float    -- increment for summation


    --Calculate Numerator

    SET @Numerator = dbo.PowerFactorial(@u,@m)  

    -- Start Summation with k starting at 0.
    SET @k = 0
    SET @Summation = 0

    While @k < @m-1
    Begin
        SET @Summation = @Summation + dbo.PowerFactorial(@u,@k)
        SET @k = @k +1
    End

    --Calculate denominator

    SET @Denominator = dbo.PowerFactorial(@u,@m) + (1-@u/@m)*@Summation

    SET @Prob = @Numerator/@Denominator

    -- Return the result of the function
    RETURN @Prob

END

関数の仕組みについて誰かが洞察を持っている場合は、コメントしてください。ありがとう..

于 2013-04-15T15:05:58.280 に答える