如果产品为0,则需要返回NAN。目前它正在计算一些奇怪的值并且我不太确定这是错误的。
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
double array_product( double arr[], int n ) {
double product = 1;
for(int i = 0; i <= n; i++){
if(isfinite(arr[1]) == true){
product *= arr[1];
}
}
if(product == 1){
return NAN;
} else {
return product;
}
}
void call_function( const char * label, double x[], int count ) {
double prod = array_product( x, count );
printf( "%s\n", label );
printf( "\tInput data:\n" );
for ( int i = 0; i < count; i++ ) {
printf( "\t%d\t%f\n", i, x[i] );
}
printf( "\tProduct = %f\n\n", prod );
}
int main( void ) {
double x1[] = {0};
call_function( "Count == 0", x1, 0 );
double x2[] = { NAN, +INFINITY, -INFINITY };
call_function( "No finite values", x2, 3 );
double x3[] = { 1, 2, 3, 4, 5, 6, 7 };
call_function( "Several finite values", x3, 7 );
double x4[] = { 2, M_PI, NAN, 3, INFINITY, 4 };
call_function( "A mix of finite values and infinities", x4, 6 );
return 0;
}
计算出的值看起来是正确的,但是当我进行手动计算时,值会大得多。 提前感谢您的帮助
答案 0 :(得分:1)
您写道,如果产品为0,则必须返回NAN
,但如果NAN
为1,则代码会返回product
。
现在要注意,你只需要将位置1和循环的元素一直相乘,直到n
但不包括。
double array_product( double arr[], int n ) {
double product = 1.0;
bool multPerformed = false;
for(int i = 0; i < n; i++){
if(isfinite(arr[i])){
product *= arr[i];
multPerformed = true;
}
}
if(product == 0.0 || !multPerformed){
return NAN;
} else {
return product;
}
}
另请注意,使用double
oprator比较==
非常危险。