使用abs-sqrt-pow的公式

时间:2017-02-05 12:18:21

标签: c math

我知道java,现在我正在努力学习C.我有一个数学问题,我试图在C上做,但我想我不知道我的代码的这一部分是否正确。数学练习是

  • 如果 | x |> 1 ,则 f(x)= 1.0÷√(|x² - 1.0 |)
  • 如果 | x | = 1 ,则 f(x)= 0
  • 最后一种情况:如果 | x |< 1 ,则 f(x)= 1.0÷√(| 1.0-x²|)

这是我的代码:

for (x = a; x <= b; x = x + h) {
    while (x < b) {
        if (abs(x) > 1) {
            y = 1 / sqrt(pow(x, 2) - 1);
            printf("y= %d", y); 
        } else
        if (abs(x) == 1) {
            y = -9999;
            printf("y= %d", y);
        } else
        if (abs(x) < 1) {
            y = 1 / sqrt(1 - pow(x, 2));
            printf("y= %d", y);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码具有无限循环:while条件是常量,因为x未在其正文中进行修改。这个while循环实际上是多余的,应该删除。

您应该将代码移动到函数定义中并给出参数并返回类型为double的值:

#include <math.h>

double f(double x) {
    if (fabs(x) > 1.0) {
        return 1.0 / sqrt(x * x - 1.0);
    } else
    if (fabs(x) == 1) {
        return 0.0;
    } else {
        return 1.0 / sqrt(1.0 - x * x);
    }
}

在此循环中使用它:

#include <stdio.h>

void print_values(double a, double b, double h) {
    for (double x = a; x <= b; x = x + h) {
        printf("f(%g) = %g\n", x, f(x));
    }
}

如Peter所述,函数f(x)可以进一步简化为:

double f(double x) {
    if (fabs(x) == 1.0) {
        return 0.0;
    } else {
        return 1.0 / sqrt(fabs(1.0 - x * x));
    }
}

并使用三元运算符:

double f(double x) {
    return (fabs(x) == 1.0) ? 0.0 : 1.0 / sqrt(fabs(1.0 - x * x));
}