我有一个用C语言实现的公式,我已经这样做了,但我得到的结果与MatLab不同
代码:
double sumVector(float x[], int M){
double y = 0;
int i;
for(i = 1; i<M ; i++){
y += (0.5*x[i]) + ((x[i])*(x[i])* (cos(floor(x[i]/4) - 32)));
}
return y;
}
其中x[]是元素为0:0.001:255的数组
- C中的结果是37022697.82
- MatLab中的结果为-12767828.5
为什么会有这么大的差异,是什么原因造成的?
2条答案
按热度按时间sdnqo3pr1#
我猜您的意思是数组
x[]
包含元素255.0、0.001、0.002……0.0。对吗?在此假设下,下面的C代码给出-12767828.504138,这与您的MatLab结果一致(在数值精度范围内)。正如注解中指出的,您应该小心使用
float
和double
,并且您可能希望您的函数循环遍历x的所有元素,包括x[0]。除此之外,我不知道如何初始化数组以及如何调用函数。qlckcl4x2#
@weathervane和@troyHaskin在评论中为您的问题提供了答案:您可能没有正确地迭代数组,因此您在C中的向量计算可能不是您想要的结果。(我们只能假设您的Matlab实现是正确的。)
在C中,数组索引从0开始,而不是从1开始。我们只能假设
M
是数组x
中的元素数,并且您确实希望在for
循环中包含所有M
元素。所以x
的元素范围从x[0]
到x[M-1]
。在您的代码中,您没有在计算中包括第一个元素x[0]
。试着这样做:请注意,我已经将
x
的类型更改为double
数组。在MatLab中,浮点数的double
is the default precision。假设C也是如此:除非您真正知道自己在做什么,否则请使用double
。这种
i=0; i<MAX; i++
是C中的常见做法。从i=1
开始或测试i<=MAX
看起来应该很奇怪。(这并不意味着它一定是错的,但它应该吸引眼球。)此外,@Olaf的注解警告您要小心C中的除法。如果两个操作数都是整数类型,它将执行整数除法。例如,如果使用1.0 instead of 1,则会强制使用浮点除法。它还让读者更清楚地知道,您使用的是浮点常量,而不是整数常量。
在Matlab中,
cos
accepts radians和C库cos()
也使用弧度。