제가 포인터 배열을 이용해서 행렬을 만든 아래의 소스를 분석하려고 했는데
<tgmath.h>가 포함되어 있더군요.
VS2010에서는 아예 tgmath.h 헤더를 찾을수 없어서 컴파일이 되지 않고
CODE BLOCKS에서 GNU GCC 컴파일러로 하니까 결과값이 이상하게 나오네요.
아래의 소스인데 vs2010에서 컴파일하고 싶어서 GNU GCC컴파일러에 포함되 있는 tgmath.h를 VS2010에서 컴파일하고 있는 디렉토리에 포함해서
#include "tgmath.h"문장을 추가해도 complex.h를 찾을 수 없다고 않되네요.
tgmath.h헤더를 사용해서 VS2010에서 컴파일해서 실행하려면 어떻게 해야 하는지 아시는분 알려 주셨으면 좋겠네요.
#include <stdio.h>
#include <stdlib.h>
#include <tgmath.h>
void showmat(const char *s, double **m, int n)
{
printf("%s:\n", s);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%12.4f", m[i][j]);
putchar('\n');
}
}
int trianglize(double **m, int n)
{
int sign = 1;
for (int i = 0; i < n; i++) {
int max = 0;
for (int row = i; row < n; row++)
if (fabs(m[row][i]) > fabs(m[max][i]))
max = row;
if (max) {
sign = -sign;
double *tmp = m[i];
m[i] = m[max], m[max] = tmp;
}
if (!m[i][i]) return 0;
for (int row = i + 1; row < n; row++) {
double r = m[row][i] / m[i][i];
if (!r) continue;
for (int col = i; col < n; col ++)
m[row][col] -= m[i][col] * r;
}
}
return sign;
}
double det(double *in, int n)
{
double *m[n];
m[0] = in;
for (int i = 1; i < n; i++)
m[i] = m[i - 1] + n;
showmat("Matrix", m, n);
int sign = trianglize(m, n);
if (!sign)
return 0;
showmat("Upper triangle", m, n);
double p = 1;
for (int i = 0; i < n; i++)
p *= m[i][i];
return p * sign;
}
#define N 18
int main(void)
{
double x[N * N];
srand(0);
for (int i = 0; i < N * N; i++)
x[i] = rand() % N;
printf("det: %19f\n", det(x, N));
return 0;
}