【问题标题】:segmentation fault (core dumped)-iteration function分段错误(核心转储)-迭代函数
【发布时间】:2019-05-23 05:58:28
【问题描述】:

我正在设置一个迭代函数,它调用另一个函数来进行一些微积分,然后在它最终收敛时找到值。但它卡在一个错误中,说这是一个分段错误(核心转储)。

这是我的代码:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <cmath> 
#include <stdio.h>
using namespace std;

double calcular(int numero)
{
    return 1.0555 - (0.24366 * (numero - 0.0555) / (numero * (numero + 0.0555)));
}

double iterar(int hola)
{
    if (abs(calcular(hola) - hola) > 0.002)
    {
        hola = calcular(hola);
        iterar(hola);
    }
    else
        return hola;
}

int main()
{
    cout << iterar(1);
    return 0;
}

【问题讨论】:

  • 你反复调用iterar,你得到了堆栈缓冲区溢出。
  • iterar(hola); -> return iterar(hola);
  • calcular(1) 的结果大约是0.837。当您将该值分配给hola 时,它将变为(当您将浮点值截断为整数值时)。想想当你打电话给calcular(0) 时会发生什么。并提示您自己弄清楚:Learn how to debug your programs!

标签: c++


【解决方案1】:
double calcular(int numero)
{
    return 1.0555 - (0.24366 * (numero - 0.0555) / (numero * (numero + 0.0555)));
}
double iterar(int hola)
{
    if (abs(calcular(hola) - hola) > 0.002)
    {
        hola = calcular(hola);
        iterar(hola);
    }
    else
        return hola;
}

应该是

double calcular(double numero)
{
    return 1.0555 - (0.24366 * (numero - 0.0555) / (numero * (numero + 0.0555)));
}
double iterar(double hola)
{
    if (abs(calcular(hola) - hola) > 0.002)
    {
        hola = calcular(hola);
        return iterar(hola);
    }
    else
        return hola;
}

因为您将分数值传递给 calcular。 numero

【讨论】:

  • 是的,它应该是 return iterar(hola);,但令人惊讶的是,即使没有返回,我的编译器也会给出正确的答案!
  • 未定义的行为就是这样 - 你不能通过寻找它来判断它不存在。
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 2020-12-08
  • 1970-01-01
  • 2018-04-03
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多