Функция ошибки, erf (x), не найдена в math.h для Visual Studio 2005 - PullRequest
4 голосов
/ 08 июня 2011

Похоже, что cmath для visual studio 2005 не имеет erf (x).Я использую набор статистических тестов NIST для генераторов случайных и псевдослучайных чисел.В методе cephes.c, double cephes_normal (double x), он использует математическую функцию C99 erf (x), которая, как мне кажется, не поддерживается Visual Studio 2005.

Как мне решить эту проблему?Я видел решение C ++ здесь: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/9f5f4bf4-c0ae-4620-8039-4dc36e98d718/

Кто-то использовал математическую библиотеку C ++ boost.Но я не думаю, что могу включить заголовок c ++ в исходный файл C.

Ответы [ 3 ]

5 голосов
/ 08 июня 2011

Некоторые Googling нашли эту реализацию C ++ (находится здесь):

erf код:

#include <cmath>

double erf(double x)
{
    // constants
    double a1 =  0.254829592;
    double a2 = -0.284496736;
    double a3 =  1.421413741;
    double a4 = -1.453152027;
    double a5 =  1.061405429;
    double p  =  0.3275911;

    // Save the sign of x
    int sign = 1;
    if (x < 0)
        sign = -1;
    x = fabs(x);

    // A&S formula 7.1.26
    double t = 1.0/(1.0 + p*x);
    double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);

    return sign*y;
}

Проверка функции

void testErf()
{
    // Select a few input values
    double x[] = 
    {
        -3, 
        -1, 
        0.0, 
        0.5, 
        2.1 
    };

    // Output computed by Mathematica
    // y = Erf[x]
    double y[] = 
    { 
        -0.999977909503, 
        -0.842700792950, 
        0.0, 
        0.520499877813, 
        0.997020533344 
    };

    int numTests = sizeof(x)/sizeof(double);

    double maxError = 0.0;
    for (int i = 0; i < numTests; ++i)
    {
        double error = fabs(y[i] - erf(x[i]));
        if (error > maxError)
            maxError = error;
    }

    std::cout << "Maximum error: " << maxError << "\n";
}   
0 голосов
/ 08 июня 2011

Ну, или напишите это самостоятельно, посмотрите на реализацию boost, C-ify и используйте это, или не используйте Visual Studio 2005 для этого проекта, но что-то вроде GCC (MinGW) вместо.

0 голосов
/ 08 июня 2011

Числовые рецепты содержит реализацию функции ошибок (глава 6 в моем издании).

В блоге Джона Д. Кука есть реализация Python , котораяпереводится тривиально.

...