gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:02:23 27 4
gpt4 key购买 nike

我有一个函数可以从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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com