C ++和Raku中的NativeCall之间的输出不同

Sum*_*nal 6 c++ math nativecall raku

我正在尝试编写一个函数,用于从此处获取的累积分布函数

这是我的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;
    }
Run Code Online (Sandbox Code Playgroud)

这是在Linux中使用gcc 6.3.0编译时的输出

0.999999                                                                                                                
1                                                                                                                       
1                                                                                                                       
1                                                                                                                       
1                                                                                                                       
0                                                                                                                       
0                                                                                                                       
0                                                                                                                       
0 
Run Code Online (Sandbox Code Playgroud)

我想使用NativeCall从raku调用相同的代码,所以我修改了代码

测试文件

extern "C" double normalCDF( double x )
{
   return  0.5 * ( 1.0 + erf( M_SQRT1_2 * x ) );

}
Run Code Online (Sandbox Code Playgroud)

创建动态.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);

Run Code Online (Sandbox Code Playgroud)

输出为:

0.999999206671848
0.9999999666795515
0.9999999892824097
0.9999999966842541
0.9999998301732593
0
0
0
0

Run Code Online (Sandbox Code Playgroud)

尽管建议使用数据容器,但相同算法的输出为何会有所不同。

系统信息:

  • 带有gcc 6.3.0的Ubuntu 18.04 64位
  • Rakudo是2019.07.1版本。

Jav*_*tíz 7

您需要以更高的精度打印浮点数。以下内容将为您提供最大的精度:

#include <limits>
#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() {

    typedef std::numeric_limits< double > dmax;
    cout.precision(dmax::max_digits10);

    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;
    }
Run Code Online (Sandbox Code Playgroud)

请注意中的#include <limits>和前两行main,尽管第2行很重要。