2017-04-01 13 views
0

製品が0の場合はNANを返す必要があります。現時点では、奇妙な値が計算されています。私は配列の積を計算するCで配列を作成しています

#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; 
} 

計算された値は正しく表示されますが、手動による計算では値がはるかに大きくなります。 は

+1

関数 'array_product()'内の 'arr [1]'のインデックスが常に '1'である理由を理解できません。すべての要素をループして乗算しようとしていませんか? – babon

答えて

1

あなたは製品が0であるが、productは1

は今、あなたはすべての時間のみを乗算注意を払っている場合は、あなたのコードがNANを返す場合NANを返すために持っていることを書いたの助けを事前にいただきありがとうございます位置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; 
    } 
} 

== opratorを使用してdoubleを比較することは非常に危険であることに注意してください。

+0

@ BobFisher3私の編集したコード –

+0

はif(n == 0 || product == 0.0)を== 1.0に変更しなければなりませんでした。あなたの助けてくれてありがとう: – BobFisher3

+0

@ BobFisher3しかし、入力配列が{1.0,1.0,1.0}ならばNANを返します。私の最新の編集を見てください。 –

関連する問題