Методы C #: определенное значение параметра по умолчанию - PullRequest
0 голосов
/ 08 ноября 2011

Я пишу приложение, которое требует вычисления гамма-функции. Ниже приведен фрагмент кода (часть класса):

namespace PB.Utilities.Math
{
// class definition
public class SpecialFunctions
{
    // Private Fields

    // Instance Constructor
    public SpecialFunctions() {}

    //  Public Method for Gamma Function
    //       x       = input value; x MUST BE > 0
    //       GammaLn = secondary output value equal to natural log of Gamma Function
    public double Gamma(double x, out double GammaLn)
    {
        try
        {
            if (x <= 0) throw new System.ArgumentException("arg <= 0 in GammaFunction", "x");
        }
        catch
        {
            System.Console.WriteLine("argument <= 0 in GammaFunction");
            System.Console.ReadKey();
        }

        double gammaln;
        double _gamma = gamma(x, out gammaln);
        GammaLn = gammaln;
        return _gamma;
    }

    //  private method for Gamma Function
    private double gamma(double xx, out double gammaln)
    {
        //  private constants
        int j;
        double x,tmp,y,ser;

        const double k1 = 5.24218750000000000;
        const double k2 = 0.999999999999997092;
        const double k3 = 2.5066282746310005;

        double[] cof = new double[14]
        {
            57.1562356658629235,     -59.5979603554754912,      14.1360979747417471,
            -0.491913816097620199,     0.339946499848118887e-4,  0.465236289270485756e-4,
            -0.983744753048795646e-4,  0.158088703224912494e-3, -0.210264441724104883e-3,
             0.217439618115212643e-3, -0.164318106536763890e-3,  0.844182239838527433e-4,
            -0.261908384015814087e-4,  0.368991826595316234e-5
        };

        y = x = xx;
        tmp = x + k1;
        tmp = (x + 0.5) * System.Math.Log(tmp) - tmp;
        ser = k2;
        for (j = 0; j < 14; j++) ser += cof[j]/++y;
        gammaln = tmp + System.Math.Log(k3*ser/x);
        return System.Math.Exp(gammaln);
    }
}
}

public class BSA
{
    static void Main()
    {
        // Create an object of type PB.Utilities.Math.SpecialFunctions
        PB.Utilities.Math.SpecialFunctions Function = new PB.Utilities.Math.SpecialFunctions();

    // Call the public method GammaFunction.
    double GammaLn1;
    double GammaLn2;
    double GammaLn3;
    double g1 = Function.Gamma(3.5, out GammaLn1);
    double g2 = Function.Gamma(1.5, out GammaLn2);
    double g3 = Function.Gamma(1/7, out GammaLn3);
    System.Console.WriteLine("g(7/2) = "+g1);
    System.Console.WriteLine("g(3/2) = "+g2);
    System.Console.WriteLine("g(1/7) = "+g3);
    }
}

Проблема заключается в том, что при компиляции параметру x в гамме (даже если x присваивается значение 3.5 в вызывающем компоненте) присваивается значение 0, которое вызывает исключение. Кто-нибудь может подсказать, пожалуйста, как мне это обойти? Спасибо.

1 Ответ

3 голосов
/ 08 ноября 2011

Кажется, 3,5 в моих тестовых случаях.Вы уверены, что не исключили некоторую информацию, которая может быть проблемой?

using System;

namespace Doubletesting
{
    class Program
    {
        static void Main(string[] args)
        {
            double d = Doubletesting.TestDouble(3.5);

            Console.WriteLine(d.ToString());

            Console.ReadKey();
        }

        public static double TestDouble(double x)
        {
            double result;

            result = x;

            return result;
        }
    }
}

Результат

3.5

ОБНОВЛЕНО

Ошибкавызвано вашим Function.Gamma(1 / 7, out GammaLn3).Это связано с тем, что 1 и 7 равны INT, а деление (int) 1 на (int) 7 равно нулю.Попробуйте Function.Gamma(1f / 7f, out GammaLn3).

...