입니다. 프로그램은 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 당신이 바로 그거야. 내가 꽤 혼란스러워. –