使用Babylonian方法的平方根返回错误的值?

时间:2015-09-23 09:46:32

标签: c struct

  

对于函数isqroot(),使用具有一个精度的Babylonian方法计算平方根,并将其返回到结构中。

我无法将值返回给结构体,当我编译它时返回垃圾值。

这是我的代码:

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

struct rootStruct {
    int rootInt;
    int rootFraction;
};

typedef struct rootStruct RootStruct;
RootStruct* isqroot (int n) {
    /*We are using n itself as initial approximation*/
    RootStruct* root=(RootStruct* )malloc(sizeof(RootStruct));
    float x = n;
    float y = 1;
    float e = 0.1; /* e decides the accuracy level*/

    while(x - y > e) {
        x = (x + y)/2;
        y = n/x;
    }
    root->rootInt = (int)x/2;
    root->rootFraction = (int)(x-root->rootInt)*100;
    return root;
}

int main(){
    RootStruct* roo+t=(RootStruct* )malloc(sizeof(RootStruct));
    printf("the sqrt is %d\n%d\n",root->rootInt,root->rootFraction);
    return 0;
}

此代码有什么问题?

1 个答案:

答案 0 :(得分:2)

您永远不会致电isqroot() ...因此永远不会设置root->rootIntroot->rootFraction

你也有输入错字

RootStruct* roo+t=(RootStruct* )malloc(sizeof(RootStruct));

应该是

RootStruct* root=(RootStruct* )malloc(sizeof(RootStruct));

没有+。但是,这是不必要的,因为您在isqroot()中分配内存并且可能应该替换为

RootStruct* root = isqroot(9);

然后忘记free() main()末尾的RootStruct* isqroot (int n) { RootStruct* root=(RootStruct* )malloc(sizeof(RootStruct)); float y = 1; float e = 0.1; /* e decides the accuracy level*/ while(fabs(n - y*y) > e) { y = (y + (n / y)) / 2; } root->rootInt = (int) y; root->rootFraction = (int) (y - root->rootInt) * 100; return root; } 记忆。

请注意,您还shouldn't case the result of malloc() in C

你也错误地实现了算法,它应该是

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

struct rootStruct {
    int rootInt;
    int rootFraction;
};

typedef struct rootStruct RootStruct;

RootStruct* isqroot (int n) {
    RootStruct* root=(RootStruct* )malloc(sizeof(RootStruct));

    float y = 1;
    float e = 0.1; /* e decides the accuracy level*/

    while(fabs(n - y*y) > e) {
        y = (y + (n / y)) / 2;
    }

    root->rootInt = (int) y;
    root->rootFraction = (int) (y - root->rootInt) * 100;

    return root;
}

int main() {
    RootStruct* root = isqroot(9);
    printf("The sqrt is %d.%d\n", root->rootInt, root->rootFraction);
    return 0;
}

那么完整的修正程序就是

.*?(:label=\w+ ).*

关于Computing Square Roots的维基百科文章在Babylonian method上有一个非常容易理解的部分。