【问题标题】:any idea why x gets to 0 and then nan知道为什么 x 达到 0 然后 nan
【发布时间】:2019-01-17 18:15:15
【问题描述】:

我创建了一个新的#define g(x),当我打印 x 并且 num 是 number int greater(>) of 2 时,它无法按预期工作

我尝试打印我的#define g(x),但没有成功

代码如下:

#define g(x,num) 1/3*(2 * x + (num / x))
#define f(x,num) x*x - num
#define var 1E-12 //(1E-12 = 10^-12)

double x;
int i;
double num;

double srt(double num) {
     x = num; 


    for(i; abs(f(x,num)) > var ;i++) {


     x = g(x,num);
      printf ("x: %f\n", x);

                        }   
    printf ("counter %d\n", i);             
    return x;
}

int main(int argc, char** argv) {

    printf("give number\n");
    scanf("%lf", &num);
    printf ("your number is num: %lf\n", num);
    printf("srt : %lf", srt(num));
    return 0;
}

【问题讨论】:

  • 你能展示一个完整的程序吗?我们需要能够看到sqrt 是如何被调用的
  • 1/3 将评估为 0
  • 感谢 Osiris 我得出的结论是 1/3 必须是 1.0/3.0 非常感谢
  • 请有人回答。 @奥西里斯?
  • 在这种情况下不要使用宏。使fg 成为真正的功能,也许是static inline 一个。然后阅读how to debug small programs。如果用作g(3.0+z),则您的代码是“错误的”

标签: c user-defined-functions


【解决方案1】:

问题出在你的宏中:

#define g(x,num) 1/3*(2 * x + (num / x))

在 C 中,1/3 被评估为整数除法,因此将始终评估为 0。要解决这个问题,至少应该使用double 而不是int

#define g(x,num) 1.0/3.0*(2.0*x + (num/x))

【讨论】:

    【解决方案2】:

    另一个问题

    int 数学

    当需要double fabs(double) 时,代码使用int abs(int)

    // for(i; abs(f(x,num)) > var ;i++) {
    for(i; fabs(f(x,num)) > var ;i++) {
    

    启用良好的编译器通常会警告此类易于检测的问题 - 包括 this one。没有很好地使用工具是这里的关键问题。

    节省时间,启用所有警告

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2013-06-26
      • 2013-07-25
      • 2018-08-07
      • 2013-03-20
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多