c++ - 此方法中堆栈溢出的原因( float 学)

标签 c++ stack-overflow

我偶尔会在这个方法中遇到 stackoverflow 异常。

double norm_cdf(const double x) {
    double k = 1.0/(1.0 + 0.2316419*x);
    double k_sum = k*(0.319381530 + k*(-0.356563782 + k*(1.781477937 + k*(-1.821255978 + 1.330274429*k))));

    if (x >= 0.0) {
        return (1.0 - (1.0/(pow(2*M_PI,0.5)))*exp(-0.5*x*x) * k_sum);
    } else {
        return 1.0 - norm_cdf(-x);
    }
}

关于我为什么会得到它有什么建议吗?我可以采取任何措施来纠正错误吗?

最佳答案

您的问题是 x 不是数字。 NAN >= 0.0 为假,-NAN >= 0.0 也为假。

您可以像其他人建议的那样专门检查 NAN,但我建议简化事情:

static double norm_cdf_positive(const double x) {
    double k = 1.0/(1.0 + 0.2316419*x);
    double k_sum = k*(0.319381530 + k*(-0.356563782 + k*(1.781477937 + k*(-1.821255978 + 1.330274429*k))));

    return (1.0 - (1.0/(pow(2*M_PI,0.5)))*exp(-0.5*x*x) * k_sum);
}

double norm_cdf(const double x) {
    if (x >= 0.0) {
        return norm_cdf_positive(x);
    } else {
        return 1.0 - norm_cdf_positive(-x);
    }
}

这样做的好处是编译器可以对其行为做出更明智的假设。请注意,我已将“内部”函数标记为静态(这会将其范围限制在当前编译单元)。您还可以使用未命名的 namespace 。 (编辑:实际上 Timothy Shields 有一种更简单的方法来删除递归,它将所有内容保存在一个函数中)

关于c++ - 此方法中堆栈溢出的原因( float 学),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154909/

相关文章:

c# - window 管道故障

typescript - 在 TypeScript 中实现堆栈安全的 Future;为什么延迟链会导致堆栈溢出?

c - 如何调试目标上的 stackoverflow 问题

java - 集合的 toString() 方法中的 StackOverflowError 是一个错误吗?

c++ - 为什么不太可能/不太可能显示性能改进?

c++ - 如何使用 QSettings 读取 Windows 注册表(默认)值?

c++ - 为什么 C++11 不支持匿名结构,而 C11 支持?

c++ - 将一个枚举映射到另一个枚举

java - 每当我运行 AVLTree.java 代码时都会出现 StackOverFlowError

c# - .Net 应用程序中带有 STATUS_STACK_OVERFLOW 的应用程序崩溃是否意味着堆栈溢出发生在 native 代码中?