Я пытаюсь написать функцию для совокупной функции распределения взято из здесь .
Это мой cpp
код:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double normalCDF( double x )
{
return 0.5 * ( 1.0 + erf( M_SQRT1_2 * x ) );
}
int main() {
cout << normalCDF(4.8) << endl;
cout << normalCDF(5.4) << endl;
cout << normalCDF(5.6) << endl;
cout << normalCDF(5.8) << endl;
cout << normalCDF(5.1) << endl;
cout << normalCDF(-37.5) << endl;
cout << normalCDF(-36.0) << endl;
cout << normalCDF(-37.6) << endl;
cout << normalCDF(-37.5) << endl;
return 0;
}
Это вывод при компиляции в linux с gcc 6.3.0
0.999999
1
1
1
1
0
0
0
0
Я хотел вызвать тот же код из raku, используя NativeCall, поэтому я изменил код
test.cpp
extern "C" double normalCDF( double x )
{
return 0.5 * ( 1.0 + erf( M_SQRT1_2 * x ) );
}
создал динамическую библиотеку .so
и записал собственный код вызова как:
use NativeCall;
sub normalCDF(num64) returns num64 is native('libtest.so') { * };
say normalCDF((4.8).Num);
say normalCDF((5.4).Num);
say normalCDF((5.6).Num);
say normalCDF((5.8).Num);
say normalCDF((5.1).Num);
say normalCDF((-37.5).Num);
say normalCDF((-36.0).Num);
say normalCDF((-37.6).Num);
say normalCDF((-37.5).Num);
Вывод:
0.999999206671848
0.9999999666795515
0.9999999892824097
0.9999999966842541
0.9999998301732593
0
0
0
0
Почемувыходные данные одного и того же алгоритма отличаются, хотя контейнеры данных используются в соответствии с рекомендациями.
Системная информация:
- Ubuntu 18.04 64bit с gcc 6.3.0
- Rakudo isВерсия 2019.07.1.