c - 由于未知原因 "if"在条件为零时起作用

标签 c

“if”总是经过第一个,即使它大多数时候为零。我不知道为什么,只有当 startr 足够大时它才会执行这些操作,在较小的 startr 上它效果很好

此外,代码的目的是找到函数的局部最小值

const double delta = 0.0000001, eps = 0.000001;

int power(int i, int n)
{
   int out = 1;
   for (int k = 0; k < n; k++)
   {
      out *= i;
   }

   return out;
}

double f(double u)
{
    return ((u * u - 3) / (u + 1));
}

int main()
{
    double l = 0, r = 0, startl = -2, startr = 15;
    int k = 0, pow = 0;
    double ll = 0, rr = 0;
    double savl = 0, savr = 0;

    l = startl;
    r = startr;
    do
    {
        ll = (l + r - delta) / 2;
        rr = (l + r + delta) / 2;

        savl = f(ll);
        savr = f(rr);

        if (savl * savl > savr * savr) r = rr; 
        if (savl * savl < savr * savr) l = ll;

        k++;
        pow = power(2, k);
    }
    while (((startr - startl) / pow + (1 - 1 / pow) * delta) > eps);

    printf("%f ", (ll + rr) / 2);

    return 0;
}

我已经编辑了代码,因此所有功能都可见

最佳答案

#include <stdio.h>
#include <math.h>

const double delta = 0.0000000001, eps = 0.000001;

int power(int i, int n)
{
    int out = 1;
    for (int k = 0; k < n; k++)
    {
        out *= i;
    }

    return out;
}

double f(double u)
{
    return ((u * u + 2 * u + 3) / (u + 2) / (u + 2));  //derivative of the f
}

int main()
{
    double l = 0, r = 0, startl = -2, startr = 15;
    int k = 0, pow = 0;
    double ll = 0, rr = 0;
    double savl = 0, savr = 0;

    l = startl;
    r = startr;
    do
    {
        ll = (l + r - delta) / 2;
        rr = (l + r + delta) / 2;

        savl = f(ll);
        savr = f(rr);

        if (savl * savl < savr * savr) r = rr; //printf("%f %f %e\n", savl, savr, savl * savl - savr * savr);
        if (savl * savl > savr * savr) l = ll;

        k++;
        pow = power(2, k);
    }
    while (((startr - startl) / pow + (1 - 1 / pow) * delta) > eps);

    printf("%f ", (ll + rr) / 2);

    return 0;
}

工作代码 问题在于 ifs 处的比较标记错误,而且我正在寻找函数的根而不是它的导数

关于c - 由于未知原因 "if"在条件为零时起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53642716/

相关文章:

c++ - 套接字最大发送数?

c++ - C union 字符数组在 mac 上打印 'd'?

c - 操作符: in C,是什么?

c - 返回错误顺序的字符串二叉树

c - scanf 在第一个 [C] 后停止工作

c - 似乎 pthread_create 正在覆盖以前的线程

c - 警告 : control may reach end of non-void function [-Wreturn-type]

c - 二进制转十进制

android - 将 C 代码文件合并为一个 C 代码文件

c - 从c中的文件中读取所有字节