プログラムは2x2行列の負の要素の平均幾何平均を計算します。私は以下のこのプログラムでコードを理解しようとしています。なぜ著者が書いたものを書いたのですか?このコードは以下の作者がコードマトリックス内の行列の幾何平均値
#include <stdio.h>
#include <math.h>
#define ROWS 2
#define COLS 2
char * last_geom_err = NULL;
float geometricMean(float * arr, int rows, int cols){
float neg_mul = 1;
int neg_count = 0;
float arr_elem;
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
if((arr_elem = *(arr + i * cols + j)) < 0){
neg_mul *= arr_elem;
neg_count++;
}
if (neg_count == 0){
last_geom_err = "no negative elements in array";
return 0;
}
if ((neg_count % 2 == 0) && (neg_mul < 0)){
last_geom_err = "a negative number under the square root of even degree";
return 0;
}
last_geom_err = NULL;
return pow(neg_mul, (float)neg_count);
}
int main(){
float arr[ROWS][COLS] = {
1., -2.,
-5., -6.
};
printf("Array:\n");
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++)
printf("%5.2f ", arr[i][j]);
putchar('\n');
}
float gm = geometricMean((float*)arr, ROWS, COLS);
if (last_geom_err != NULL)
printf("#Error of calculation: %s", last_geom_err);
else
printf("Geometric mean of negative elements of array = %5.2f", gm);
return 0;
}
なぜこの中であまりにも多くのポインタを書いたもの、それはハード を理解するために見つけるイムのでしょうか?
char * last_geom_err = NULL;
float geometricMean(float * arr, int rows, int cols){
float neg_mul = 1;
int neg_count = 0;
float arr_elem;
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
if((arr_elem = *(arr + i * cols + j)) < 0){
neg_mul *= arr_elem;
neg_count++;
}
if (neg_count == 0){
last_geom_err = "no negative elements in array";
return 0;
}
if ((neg_count % 2 == 0) && (neg_mul < 0)){
last_geom_err = "a negative number under the square root of even degree";
return 0;
}
last_geom_err = NULL;
return pow(neg_mul, (float)neg_count);
}
及びこれ
float gm = geometricMean((float*)arr, ROWS, COLS);
if (last_geom_err != NULL)
printf("#Error of calculation: %s", last_geom_err);
else
printf("Geometric mean of negative elements of array = %5.2f", gm);
return 0
何、唯一の整数の指数に負の拠点を扱うので、はNaNを返すこと、しかし
のようになります特にあなたは理解していないのですか?基本的なC構文を理解していますか? –
@ MarkByers、それは、行列がフラットなメモリ内表現でアクセスされる方法に関係していると思われます( '(float **)'から '(float *)'へのキャストに注意してください)。 – geekosaur
@geekosaurあなたは正しいです。どこかでかなり混乱しています。 –