간단한 C언어 소스입니다. 결과가 이상하게 나와요 자료형 문제인가요?

yjster의 이미지

2by2 역행렬 구하는 함수 입니다

double inv_arr(long double *arr[]) {
	long double det;
	int i, j;
	long double temp;
 
	det = (arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0]);
 
	for( i=0; i<2; i++)
	{
		for (j=0; j<2; j++)
		{
			arr[i][j]=arr[i][j]/det;
		}
	}
 
	temp = arr[0][0];
	arr[0][0] = arr[1][1];
	arr[0][1] = -arr[0][1];
	arr[1][0] = -arr[1][0];
	arr[1][1] = temp;
}

그냥 보통 정수를 넣고 하면 역행렬은 잘 구해집니다.
그런데 데이터를 넣어서 해야하는데 맽랩의 inv함수 결과와 비교해보면 값이 다릅니다.
원인을 알 수가 없네요 ㅠ

yukariko의 이미지

일단 반환형은 void겠군요.
역행렬구하는것에서 틀린것은없어보이고
함수의 인자가 단순한더블포인터로 되어있는데
2차원배열 뒷부분의 크기를모르면 2차원배열사용이 의도치않은 결과를 가져올 수 있습니다.
arr[][2] 같은 선언을 고려해보시고
다른원인이라하면 소숫점오차 정도겠네요

yjster의 이미지

소수점오차라기엔 차이가 너무 크고...
함수 내에서 확인해본 결과 데이터는 arr배열에 잘 들어가던데
그래도 문제가 될까요?
인자로 받는 배열이 동적 배열이라서 arr[][2]로 되지 않는거 같더라구요.

yukariko의 이미지

다른부분의 오류도 고려해야하기때문에 위소스만으론 알아내기 힘드네요. 적어도 함수를 호출하는부분의 소스를 읽어봐야 할 것 같네요.
그리고 오차가 크다고 하셨는데
그 크다는 것의 정의는 어느정도인지, 구체적으로 어떤 입력에서 어떤 결과가 차이나는지,
정말 문제를 해결하시고 싶으시다면 최대한 자세히 질문을 하실 필요가 있어보입니다.

익명 사용자의 이미지

double inv_arr(long double *arr[]) {

여기서 *arr[]을 (*arr)[2]로 바꿔야 합니다. (들어오는 행렬이 항상 2x2라는 가정 하에...)

C의 함수 매개변수에서 array of...는 pointer to ... 로 바뀌기 때문에
함수 내부에서 이차원 배열 혹은 일차원 배열에 대한 포인터로 받는 것이 아니라
이중 포인터로 받게 되죠. 이러면 의도하신 것과는 다르게 작동합니다.

챕터 하나 급의 기본적인 내용에 대한 설명이 필요하므로
가지고 계신 C언어 책의 포인터와 배열 부분을 다시 한번 공부하시길 권합니다.

shint의 이미지

1. 역행렬 2x2 C언어'를 네이버에서 찾아보면. 이렇게 나옵니다.
2. 역행렬은 제가 잘 모르겠지만. 해보니까. 실행은 됩니다.
3. printf("%Lf", arr[0][0]); long double 형은 이렇게 볼 수 있습니다.
4. long double *arr[] 과 같은 방식으로 인자값을 넘기는것은 어떻게 하는지 잘 모르겠습니다.
int main(int argc, char *argv)와 같은 방식이 있기는 하지만. 사용하기 어렵습니다.
5. 실행되는 프로젝트 예제를 파일로 올리시는것이 알아보기 쉽습니다.
6. 첨부하신 예제와 아래 사이트주소의 예제 결과값이 다릅니다.

이 부분이 다릅니다.

// 여인자행렬의 전치행렬구하기
// 위의 공식을 적용하면
// inverse[0][0] = mat2x2[1][1] / det;
// inverse[0][1] = -mat2x2[0][1] / det;
// inverse[1][0] = -mat2x2[1][0] / det;
// inverse[1][1] = mat2x2[0][0] / det;

for( i=0; i<2; i++)
{
for (j=0; j<2; j++)
{
arr[i][j]=(long double)arr[i][j]/(long double)det;
}
}

temp = arr[0][0];
arr[0][0] = arr[1][1];
arr[0][1] = -arr[0][1];
arr[1][0] = -arr[1][0];
arr[1][1] = temp;

http://blog.secmem.org/86

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67195158&qb=7Jet7ZaJ66CsIDJ4MiBD7Ja47Ja0&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67092698&qb=7Jet7ZaJ66CsIEPslrjslrQ=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

twinwings의 이미지

2차원부터 특히 심하게 달라지지요. 윗윗분 답변이 정답인듯 합니다.

double **로는 원하시는 오프셋 연산이 제대로 되지 않습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.