Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Basic C程序,巴比伦算法_C_Algorithm_Math_Integer_Double - Fatal编程技术网

Basic C程序,巴比伦算法

Basic C程序,巴比伦算法,c,algorithm,math,integer,double,C,Algorithm,Math,Integer,Double,我是C语言的新手,我正在尝试做一个我们在大学里得到的实验教程 我们被要求做以下工作: 任务1。 计算数字n平方根的巴比伦算法如下: 1.对答案进行猜测(您可以选择n/2作为初始猜测) 计算r=n/猜测 设置猜测=(猜测+r)/2 根据需要返回步骤2进行尽可能多的迭代。第2步和第3步执行得越多 重复,越接近n的平方根 编写一个程序,输入n的整数,迭代巴比伦算法 五次,并以双精度到小数点后两位的形式输出答案。你的回答会 对于较小的n值,最精确 以下是我写的: #include <stdio.h

我是C语言的新手,我正在尝试做一个我们在大学里得到的实验教程

我们被要求做以下工作:

任务1。 计算数字n平方根的巴比伦算法如下: 1.对答案进行猜测(您可以选择n/2作为初始猜测)

  • 计算r=n/猜测
  • 设置猜测=(猜测+r)/2
  • 根据需要返回步骤2进行尽可能多的迭代。第2步和第3步执行得越多 重复,越接近n的平方根
  • 编写一个程序,输入n的整数,迭代巴比伦算法 五次,并以双精度到小数点后两位的形式输出答案。你的回答会 对于较小的n值,最精确

    以下是我写的:

    #include <stdio.h>
    #include <math.h>
    
    int n;
    
    main(void){
        printf("Enter a value for n: ");
        scanf("%d",&n);
        double guess = n / 2;
        for (int i = 0; i < 5; i++) {
            double r = n / guess;
            double guess = (guess + r) / 2;
        }
        printf("%d",guess);
    }
    
    #包括
    #包括
    int n;
    主(空){
    printf(“输入n:”的值);
    scanf(“%d”和“&n”);
    双猜测=n/2;
    对于(int i=0;i<5;i++){
    双r=n/猜测;
    双猜测=(猜测+r)/2;
    }
    printf(“%d”,猜测);
    }
    

    我哪里出错了?它吐出了荒谬的结果;例如,如果我输入“4”作为n,答案应该在“2”左右,但每次都会给出不同的巨大结果。

    巴比伦算法对我来说似乎不正确,应该是这样的

       int i;
       float n,guess=1;
    
       printf("\nEnter the Number: ");
       scanf("%f",&n);
       for(i=0;i<PRECISION;i++)
       {
           guess=(guess+n/guess)/2;
       }
       printf("\nThe Square root of %f is %f",n,guess);
    
    inti;
    浮点数n,猜测=1;
    printf(“\n输入数字:”);
    scanf(“%f”、&n);
    
    因为(i=0;i巴比伦算法对我来说似乎不正确,它应该是这样的

       int i;
       float n,guess=1;
    
       printf("\nEnter the Number: ");
       scanf("%f",&n);
       for(i=0;i<PRECISION;i++)
       {
           guess=(guess+n/guess)/2;
       }
       printf("\nThe Square root of %f is %f",n,guess);
    
    inti;
    浮点数n,猜测=1;
    printf(“\n输入数字:”);
    scanf(“%f”、&n);
    
    对于(i=0;i这里有一些错误

    首先,您已经在循环中确定了
    guess
    的第二个实例的范围。去掉该行上的
    double
    声明。因此它应该是:

    guess = (guess + r) / 2;
    
    其次,因为
    guess
    是一个
    double
    ,所以在
    printf
    调用中需要使用
    %f
    而不是
    %d

    printf( "%f", guess );
    

    一旦你得到它,考虑运行算法直到达到一定的精度。< /P>

    const double epsilon = 0.0001;
    double guess = (double)n / 2.0;
    double r = 0.0;
    while( fabs(guess * guess - (double)n) > epsilon )
    {
        r = (double)n / guess;
        guess = (guess + r) / 2.0;
    }
    

    这里有几件事不对

    首先,您已经在循环中确定了
    guess
    的第二个实例的范围。去掉该行上的
    double
    声明。因此它应该是:

    guess = (guess + r) / 2;
    
    其次,因为
    guess
    是一个
    double
    ,所以在
    printf
    调用中需要使用
    %f
    而不是
    %d

    printf( "%f", guess );
    

    一旦你得到它,考虑运行算法直到达到一定的精度。< /P>

    const double epsilon = 0.0001;
    double guess = (double)n / 2.0;
    double r = 0.0;
    while( fabs(guess * guess - (double)n) > epsilon )
    {
        r = (double)n / guess;
        guess = (guess + r) / 2.0;
    }
    

    另一个解决办法是:

    guess = guess / 2.0; 
    
    这将“强制”浮点操作

    变量
    guess
    已经在作用域中。不能重新声明它(就像在循环中所做的那样)。只能将其设置为新值

    您还需要将
    printf
    更改为:

    printf("%f",guess);
    
    有关printf格式化程序的更多信息,请查看此链接:


    另一种解决方案是:

    guess = guess / 2.0; 
    
    这将“强制”浮点操作

    变量
    guess
    已经在作用域中。不能重新声明它(就像在循环中所做的那样)。只能将其设置为新值

    您还需要将
    printf
    更改为:

    printf("%f",guess);
    
    有关printf格式化程序的更多信息,请查看此链接:


    谢谢,这很有效,两个答案都是关于钱的;但是我如何让它打印到小数点后2位?格式说明符
    “%.2f”
    。是否需要
    “%.2lf”
    ,还有争议。我认为浮动在变量参数列表中隐式转换为双精度。
    %lf
    %f相同
    l
    修饰符只影响整数类型。
    float
    被转换为变量函数的
    double
    ,因此
    %f
    就足够了。在支持
    长双精度
    的系统上,应该使用
    %Lf
    格式说明符(注意:大写
    l
    )。谢谢,这很有效,两个答案都在钱上;但是我如何让它打印到小数点后2位?格式说明符
    “%.2f”
    。是否需要
    “%.2lf”
    。我认为浮动在变量参数列表中隐式转换为双精度。
    %lf
    %f>相同
    l
    修饰符只影响整数类型。
    float
    被转换为变量函数的
    double
    ,因此
    %f
    就足够了。在支持
    长双精度
    的系统上,应该使用
    %Lf
    格式说明符(注意:大写
    l
    )。值得指出的是,这个答案解决了输入小于2的不良行为,因为除以0:
    double r=n/guess;
    。在进入该循环之前,可能也应该进行检查以确保
    n>0
    。值得指出的是,这个答案解决了输入小于2的不良行为大于2,因为被零除:
    double r=n/guess;
    。在进入该循环之前,可能也应该进行检查以确保
    n>0