我的目的是比较两种不同的方法来计算多项式.. 但如果你在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;
}
答案 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应该告诉你代码中有什么问题。