[초보 c언어질문] #include <stdlib.h> 를 추가하니깐....계산값이 inf 뜨는건 왜인가요?

freebsd626의 이미지

"사용환경은 64bit컴 레드햇 리눅스입니다.

#include stdlib.h> 가 없을때는 계산이 잘되고,

#include stdlib.h> 를 추가하였을때는 계산값이 inf 라고 뜹니다.

제차확인한결과 #include stdlib.h> 유무에따라 달라집니다.

무슨 이유일까요? ㅠ

사용한 수학함수는 다음과같습니다. 확인을 다해봤는데, 산술적, 문법적 오류는 없습니다.
"c" 값을 출력함에 있어, #include stdlib.h> 가 있을때만 inf 라 뜹니다. "

f[i][0]=p1*exp(-(r[i][0]-p2)*(r[i][0]-p2)/(2*p3*p3))+p4;
c=c+(si[i][0]-f[i][0])*(si[i][0]-f[i][0])/abs(si[i][0]);

무슨이유인가요?

===========================
그리고, 쌩뚱맞은 질문입니다만...

for 초기화/조건문/증감문/에서는 정수값만 사용하게되어있습니다. 그 이유는 무엇인가요?
그냥 실험으로 초기화나 증감문에 유리수(소수)를 넣어보았더니 무한루프를 돌더라구요.

이게가능하면 무척편해지는데 일일히 증감수식을 따로 쓰는게 귀찮습니다. 고수분들의 노하우를 알고싶네요.

익명 사용자의 이미지

재미있는 상황이군요.
두 질문 모두에 대해서, 가능하다면 전체 소스, 또는 상황 재현이 가능하게 간략화한 소스를 올려주시면 감사하겠습니다.

freebsd626의 이미지

>>>>>>>>>>>>>파일재첨부했습니다. Q.zip 를 봐주세요.

파일 첨부했습니다. 소스안에 주석처리해서 표기했습니다.

1. stdlib.h 부분
2. for 문 부분 (유리수 입력경우에는 단순 반복 무한이 아니라 값이 burst 되며 무한루프도는 경향입니다.) 제판단으로는 0.0000꼴의 값자체를 인식못하게되어있는게 아닌가 싶습니다만....

댓글 첨부 파일: 
첨부파일 크기
Package icon Q.zip3.18 KB
익명 사용자의 이미지

1. float타입므로 fabsf()를 쓰시면 됩니다.
2. i4 + 0.5 같은 것을 for문에서 쓰고 싶다면 i4의 타입을 float 또는 double로 하셔야 합니다.

freebsd626의 이미지

1번 조언의 경우...

여전히 이상한값이 나옵니다. stdlib.h 쓰고, float타입선언, fabsf()함수사용했습니다.

2번은 아직 시도 안해봤네요...

이건 좀 복잡하고, 오늘 바빠서리..내일쯤 결과 말씀드리겠습니다.ㅋㅋ

익명 사용자의 이미지

1.
abs()는 stdlib.h에 정의된 함수이기 때문에, stdlib.h를 include하는 것이 맞습니다. 그런데, stdlib.h를 include하지 않았는데 왜 잘 실행되냐면,
gcc에 -Wall 옵션을 주어서 컴파일했다면 Warning이 떳을 겁니다. 그래도 실행파일은 만들어집니다. abs()가 libc에 포함된 함수이기 때문에, 링커가 에러를 내지 않게 되죠. 하지만 올바른 실행을 보장하지도 않고, 어떻게 실행이 된다고 하더라도 결과값이 맞다는 보장도 없습니다.

그런데, 질문글을 자세히 살펴보니 정황상 abs()가 아닌 fabs()를 써야 하는 상황으로 보입니다. si[][]나 f[][]가 double 타입 변수라면 fabs()를 써야 하는 것이 맞습니다.

2.
말씀하신 유리수라 함은 1/2, 2/3 같이 정수/정수 를 프로그램상에 넣었단 말씀신지요? 그렇다면 상황에 따라서는 예시로 든 1/2, 2/3 가 모두 0으로 해석되었을 가능성이 있습니다. 그럴 경우 무한루프를 도는 상황도 충분히 재현 가능하고요. 1.0 / 2.0, 2.0 / 3.0 같이 써야 실수로 해석되어 0이 되지 않습니다.

freebsd626의 이미지

1. abs()을사용하고, stdlib.h 미사용시... gcc 컴파일상 메세지가 단하나도 뜨지 않았습니다. 단지 -lm 옵션만 주고 컴파일했구요. 그리고 모두 float으로 정의하였고, double로 하였을 경우 값이 엉터리로 나오더라구요. 님말씀처럼 double 정의시 fabs() 를 쓰고 stdlib.h 를 썼어야한다는 말씀인거죠? 그렇지 안을경우 제방식대로해도 되고요?

2. 아 0.5 처럼 넣었구요. 초기조건에 1.1 같이 넣어도 무한루프돌았씁니다. 0.0 으로 넣어봤더니 문제없네요..ㅋㅋㅋ 정수가 아니면, 그냥 0으로 처리되는게 이유군요...근데 왜 정수만 처리되게 만들어 놨져? 유도리있게 안만들고요....

답변감사합니다. ^^

익명 사용자의 이미지

1. double타입에서 fabs(), float()타입에는 fabsf() 입니다. 정수 타입에서만 abs()를 씁니다. man abs 나 man fabs 하셔서 살펴보시기 바랍니다.
2. 0.5는 0, 1.5는 1이 되는 식입니다. 위에서 썻다시피 for문이 정수만 되는 것이 아니라, i4가 정수 타입 변수이기 때문에 0.5가 정수 0으로 해석되는 것입니다. 선언부에서 float i4; 하시면 0.5가 온전히 살아남습니다.

freebsd626의 이미지

1. 저는 정수가아닌데도(float) abs()가 계산됩니다..아마 보셨듯이..

2. 방금 확인했습니다...여전히 무한루프돕니다..
아래 코드로 체크했는데...211 에서 0.1씩 증가하다 213 까지 가야하는데..즉, 20개 데이터만나와야하는데 무한루프돌며 sum값 발산...

int main()
{
float i1;
float sum=0;

for(i1=211; i1<=213; i1+0.1)
{
sum=sum+i1*i1;;
printf("%f\n",sum);
}

return 0;

백연구원의 이미지

./a.out
44521.000000
89084.210938
133689.656250
178337.359375
223027.328125
267759.593750
312534.156250
357351.062500
402210.312500
447111.937500
492055.968750
537042.375000
582071.250000
627142.562500
672256.375000
717412.687500
762611.500000
807852.812500
853136.687500
898463.125000


소곤소곤

junkl의 이미지

int main()
{
 float i1;
 float sum=0;
 
  for(i1=211; i1<=213; i1+=0.1)
  {
    sum=sum+i1*i1;;
    printf("%f\n",sum);
  }
 
return 0;
}

에서 i1을 증가시키는 부분 오타내신거죠?
freebsd626의 이미지

제가 실수했네요....ㅠ 됩니다..
제가 몰랐네요...에고고...

익명 사용자의 이미지

1.
말씀드렷다시피 float변수에 abs()를 쓰더라도 계산이 될 수도 있습니다. 하지만 결과로 나온 값이 잘못된 값이 됩니다.
왜 자꾸 abs()에 미련두시는지 모르겠습니다. 그부분 fabsf()를 써야 하는게 100%입니다.

fabsf()를 썻는데 프로그램 결과가 이상하다면, 프로그램의 다른 어떤 부분에 문제가 있는 겁니다.

2.
gcc를 쓰고 계신지 모르겠는데 혹시 그렇다면, gcc로 컴파일할 때 꼭 -Wall 옵션을 주고 컴파일하는 습관을 반드시 들이시기 바랍니다.
abs() 나 지금 i1+0.1 이나 모두 -Wall 옵션만 주었으면 알 수 있는 오류들입니다.

jick의 이미지

(냉무)

freebsd626의 이미지

1. 아...차이점을 정확히 이해해보려고 그렇게 질문했습니다..ㅋ fabsf()가 맞는거군요..>>>> 확인해보니 fabsf() 가 옳은 결과네요...
제가 착각햇네요 -_-;;; 감사합니다.

2. 제가 -Wall 옵션에 대해 잘 몰랐습니다..새로운거 알아갑니다..감사합니다.꾸벅.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.