我的多项式计算代码中的错误在哪里?

时间:2011-09-27 07:11:25

标签: c macos gcc

我的目的是比较两种不同的方法来计算多项式.. 但如果你在mac上运行它(我的电脑是MacBook Air) 你会发现两个结果不同...... 。但.... 如果删除“/ * ... * /”部分或删除“for ...”之前的两个“//” 它工作得很好......

plus..it在linux上工作正常...

谁能告诉我为什么?..

这是我的计划:

#define MAX_NUM 10
#define TEST_TIME 1
#define test_type double

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

test_type normal_method(test_type *a, test_type x, int degree)
{
    test_type s = 0.0;
    test_type e = 1.0;

    for (int i = 0; i <= degree; i++) {
        s += a[i] * e;
        e *= x;
    }

    printf("%lf\n", s);

    return s;
}

test_type horner_method(test_type *a, test_type x, int degree)
{
    test_type s = a[degree];

    for (int i = degree - 1; i >= 0; i--) {
        s *= x;
        s += a[i];
    }

    printf("%lf\n", s);

    return s;
}

void generate_data(test_type *a, test_type *x, int degree)
{
    srand( time(NULL) );
    for (int i = 0; i <= degree; i++) {
        a[i] = (test_type)(rand() % MAX_NUM + 1) / (test_type)(rand() % MAX_NUM + 1);
        *x = (test_type)(rand() % MAX_NUM + 1) / (test_type)(rand() % MAX_NUM + 1);
    }

}

int main()
{
    const int degree = 10;
    test_type a[degree];
    test_type x;

    generate_data(a, &x, degree);

//Just by clear the /**/ below, the program will work fine....
/*    
    printf("x = %lf\n", x);
    for (int i = 0; i <= degree; i++) {
        printf("%lf\n", a[i]);
    }
*/
    clock_t begin, end;

//  Or clear the two // below, it will work fine too....

    begin = clock();
//    for (int i = 0; i < TEST_TIME; i++) 
        normal_method(a, x, degree);
    end = clock();
    printf("The normal method used %d clock times\n", end - begin);

    begin = clock();
//    for (int i = 0; i < TEST_TIME; i++)
        horner_method(a, x, degree);
    end = clock();
    printf("The horner method used %d clock times\n", end - begin);

    return 0;
}

2 个答案:

答案 0 :(得分:5)

您正在访问的内存超出您在main中创建的数组的范围,并在其他函数中使用。这种情况发生在至少三个地方。

  • normal_method中的循环边界从零到十:

    for (int i = 0; i <= degree; i++) {  // a[degree] is out of bounds
    
  • horner_method的第一行,您正在访问超出阵列范围的内存:

    test_type s = a[degree];  // a[degree] is out of bounds
    
  • generate_data中的循环边界与normal_method中的循环边界不一致:

    for (int i = 0; i <= degree; i++) {  // a[degree] is out of bounds
    

答案 1 :(得分:0)

您不应使用%lf来打印double。只需%f即可。您可能会将其与scanf混淆,后者需要l

使用编译器警告选项-Wall -Wextra -Wformat=2 gcc应该告诉你代码中有什么问题。