log함수 질문입니다

geneven의 이미지

double x;
x = log10( 100.0 );
printf("%lf\n", x);

이렇게 했는데 출력문엔 0.00000밖에 안나오거든요?
원래는 2.000000이 되어야 정상 아닌가요?

gcc 3.2.1에서 했습니다만..

freerion의 이미지

%lf 가 아니라 %f 아닌가...
그럼 수고요..

geneven의 이미지

freerion wrote:
%lf 가 아니라 %f 아닌가...
그럼 수고요..

안되는군요..

geneven의 이미지

math.h를 include하니까 해결되는군요

근데 전 컴파일할때 -lm옵션 붙이고 저 파일은 포함하지 않았는데도
log함수를 에러없이 컴파일했는데 왜 그런거죠??

stdio.h를 포함하지 않아도 printf를 쓸수있는건 왜그런건가요?

arimae의 이미지

-lm 옵션을 줌으로써 함수의 실제 구현 부분을 찾을수는 있었지만, math.h 를 include 하지 않아
함수의 프로토타입은 제공되지 않았습니다.

보통 헤더파일을 include 하지 않아도 에러없이 컴파일은 할 수 있습니다.
하지만, 함수의 프로토타입을 제공하지 않은 경우에는 함수의 리턴값이나 인자등의 형식을 알 수 없어
이 경우 C 에서는 int 로 가정한다고 들었습니다.

따라서 log10 함수의 리턴 값을 int 형으로 가정하므로 그것때문에 그런 현상이 발생한 것 같습니다.

우연히 이 형식이 맞거나 printf 같이 리턴값을 받지 않는 경우 큰 문제가 없겠지만, 그렇지 않은 경우에는
원하는 대로 작동하지 않는 경우가 생길수가 있으니 반드시 헤더 파일을 포함시키는것이 좋습니다.

Dream, Passion and Challenge..

ihavnoid의 이미지

네... 아주 완전히 뒤통수 맞는 경우가 생기죠....

예전에 비슷한 경험을 해본 적이 있습니다.... 까먹고 프로토타입을 선언 안 해줬더니.. 실수 값이 뭘 집어넣어도 0이 나오더군요...-_-

디버거로 하나하나 쫓아가서... 봐도
분명히 로컬변수값은 1.2얼마얼마인데... 함수 안에 들어가면
0이 되어있고...

-_-결국은 디스어셈블 해서...-_-알아냈다는...

사실 이런 실수는 -Wall 옵션을 붙여서 컴파일하면 금방 알아낼 수 있죠....

혹시 위에 설명이 되었나 안 되었나 못봤지만...
그냥 이유를 설명해드리면...

prototype 선언을 안 해놓으면... 기본으로 리턴값과 모든 파라메터는 int라고 생각합니다... 당연히 호출하는 쪽에서는 이를 int로 캐스팅하고... 받는쪽에서는 제대로 받지를 못하고.....

게다가 특별히 옵션을 안 걸어놓으면 워닝도 하나도 안 뜨고...

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

gnugpl의 이미지

궁금합니다.

RM -RF /bin

arimae의 이미지

man gcc 하니 다음과 같이 나오네요..

-Wall  All of the above `-W' options combined.  These  are
       all the options which pertain to usage that we rec-
       ommend avoiding and that  we  believe  is  easy  to
       avoid, even in conjunction with macros.

간단히 말해서 warning 이 발생할 수 있는 모든 경우에 warning 출력을 해주라는 것입니다.

보통 모든 경우에 대해 warning 이 켜지지 않았는데, 위 옵션을 주면 모든 Warning에 대해 출력을 해줍니다.

Dream, Passion and Challenge..

pynoos의 이미지

geneven wrote:
stdio.h를 포함하지 않아도 printf를 쓸수있는건 왜그런건가요?

header를 포함하지 않아도 C++에서는 그렇게 안되지만 C에서는 잘 되는 이유는 사용하는 함수명이 그대로 object file에 symbol로 들어가 link되기 때문입니다.

하지만, C++에서는 argument를 알아야 정확한 symbol이 만들어 집니다.

function name mangling 혹은 decoration 이라고하지요.

댓글 달기

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