python - 从C++函数与Python函数返回的值不一致,导致偏正态分布

标签 python c++ python-3.x c++11 stl

我有一个函数可以从C++和Python中的偏态正态分布估计alpha参数。 Python函数使用NumPy编写,而C++函数使用STL。我的问题是我的C++实现给我错误的结果。这两个函数本质上是相同的,但是Python版本给了我正确的结果,而C++却没有给我-我已经详细研究了这个问题,而且我不能得出导致错误的原因的结论,任何帮助都将是很大的。

Python函数

import numpy as np
def convert_to_alpha(skew):
    a = np.pi/2 
    skew_ = abs(skew)
    numerator = np.power(skew_, (2/3)) 
    b = (4-np.pi)/2
    b = np.power(b, (2/3))
    denom = numerator + b
    delta = np.sqrt(a * (numerator/denom))
    a = delta/np.sqrt((1-np.power(delta, 2)))
    return a * np.sign(skew)

C++函数
double convert_to_alpha(double skew)
{
    double pi = 3.141592653589793;
    double a = pi / 2;
    double skew_ = std::abs(skew);
    double numerator = std::pow(skew_, (2 / 3));
    double b = (4 - pi) / 2;
    b = std::pow(b, (2 / 3));
    double denom = numerator + b;
    double delta = std::sqrt(a * (numerator / denom));
    double alpha = delta / std::sqrt((1 - std::pow(delta, 2)));
    if (skew == 0) { return 0; }
    else if (std::signbit(skew) == 1) { return -1 * alpha; } 
    else return alpha; 
}

Python函数返回我期望的值,而C++函数则没有,例如,输入0.99的示例期望27.85xxxx或输入0.5的示例期望2.17xxxx正是我从Python实现中得到的,C++给出了我1.91306。

另外,奇怪的是-无论输入什么,C++实现似乎都返回1.91306。

C++的驱动程序代码
#include <cmath>
#include <math.h>
#include <iostream>

int main()
{
    double convert_to_alpha(double skew);
    std::cout << "skew: " << convert_to_alpha(0.99);
    return 0;
}
double convert_to_alpha(double skew)
{
    double pi = 3.141592653589793;
    double a = pi / 2;
    double skew_ = std::abs(skew);
    double numerator = std::pow(skew_, (2 / 3));
    double b = (4 - pi) / 2;
    b = std::pow(b, (2 / 3));
    double denom = numerator + b;
    double delta = std::sqrt(a * (numerator / denom));
    double alpha = delta / std::sqrt((1 - std::pow(delta, 2)));
    if (skew == 0) { return 0; } // if skew is 0 return 0 
    else if (std::signbit(skew) == 1) { return -1 * alpha; } // if skew is negative return -alpha
    else return alpha; // if skew is positive return alpha
}

我希望结果会非常相似,绝对不会像目前那样有所不同。我之前从未遇到过这样的问题,因此,找出导致C++实现不一致的原因的任何帮助都将非常有帮助。

最佳答案

在我只能假定用作浮点运算的地方,您使用了很多整数。

诸如

  double numerator = std::pow(skew_, (2 / 3));

将解决成
  double numerator = std::pow(skew_, 0);

因为整数中的2/3只会降到0

如果要确保这些除法保持正确的值,请确保至少一个操作数是浮点型或 double 型:
  double numerator = std::pow(skew_, (2.0 / 3.0));

关于python - 从C++函数与Python函数返回的值不一致,导致偏正态分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61994436/

相关文章:

python - 如何解码 DER/PEM 格式的 IPFS 私钥和公钥?

c++ - insert_iterator 失效规则

c++ - 每个大型项目都包含一个 Lisp 解释器吗?

python - 查找一个非常长的字符串的所有子字符串 - 内存错误

Python 守护进程使用相同的对象列表

python - 为什么 ActionChains 拖放 (Selenium WD) 不适用于此脚本?

python - 特征选择

python - 使用 Python 进行谷歌搜索

c++ - const int 变量和数字的不同类型推导

python-3.x - 如何保存和加载手套模型?