2010-08-18 5 views
2

나는 C로 프로그램을 작성 중이다. 로그 기능을 사용하는 일부 확률 계산을 수행하는 부분이있다. 일반 라이브러리 함수 로그는() ...로그 기능이 잘못되었습니다 !!! 어떤 단서?

코드는 다음과

double somevalue = 0.29558101472995091; 
temp = log(somevalue) 

그리고 무엇을 생각 같은 것입니다? 임시 직원의 가치는 -1856.0000000000000입니다 !!! 로그에 주어진 값으로

int main() 
{ 
    double somevalue; 
    double temp; 

    somevalue = 0.29558101472995091; 
    temp = log(somevalue); 
    return 0; 
} 

Results: 
Somevalue = 0.29558101472995091 
temp = -1856.0000000000000 

미친하지 그것을인가 ... 나도이 테스트 코드를 작성 일부 구조체 내부에서, 그리고 같은 결과를 얻었다. 누구나 여기서 무슨 일이 일어나는가에 대한 단서가 있습니다.

그리고 Visual Studio 2005를 사용하고 있습니다. 지금 다른 컴파일러에 손을 넣을 수 없습니다. 당신의 구문이 올바른지처럼

감사합니다,

마이크로 커널 :

+2

어떻게 임시 직원의 가치를 확인하고 계십니까? printf를 잘못 사용하면 log() 함수가 잘못된 것보다 더 많이 발생합니다. –

+0

참조 용 : log (0.29) = 약 -0.5 –

+0

이 방법은 도움이되지 않지만 gcc에서 실행하면 -1.21881 . – Starkey

답변

8

당신은 그래서 컴파일러가 제대로 log()를 호출합니다 #include <math.h>해야합니다. math.h가 포함 된 경우

사용 VC10, 내가 printf ("log(%lf) = %lf\n", somevalue, temp)에서 다음과 같은 결과를 얻을 : math.h가 포함되어 있지 않습니다

log(0.295581) = -1.218812 

, 내가 얻을 :

log(0.295581) = -1856.000000 

무엇 아마 일어나고있는 것은 컴파일러이다 log()에 대한 호출의 반환 값은 int이 될 것으로 예상하고 double으로 변환하여 temp에 저장합니다. 나는 내 머리 꼭대기에서 부동 소수점 결과가 컴파일러에 의해 반환되는 방법을 모르지만, int 결과가 EAX에서 반환되는 동안 FP (0) 레지스터에 반환된다고 추측 할 수 있습니다 (x86 Win32 플랫폼). 따라서이 경우 컴파일러의 값은 log() 함수가 반환하려고 시도하는 값과 아무 관계가 없을 수도 있습니다.

당신이 /W3에 경고 레벨을 설정하면이 문제에 대해 경고를 얻을 것이다 : 제 생각에는

C:\TEMP\test.c(10) : warning C4013: 'log' undefined; assuming extern returning int 

당신이 이용하지 않는 정말 오래된 코드베이스로 작업하지 않는 한 여기

#pragma warning(error : 4013) // or use the `/we4013` compiler option 

컴파일 가능한 시험 것 :

함수 프로토 타입, 그것은 오류로 경고 것을 설정하는 좋은 감각을 만들 수도 있습니다 (C로 컴파일 할 때 물론, ++이 오류는 이미)
#include <stdio.h> 
//#include <math.h> 

int main() 
{ 
    double somevalue; 
    double temp; 

    somevalue = 0.29558101472995091; 
    temp = log(somevalue); 

    printf ("log(%lf) = %lf\n", somevalue, temp); 

    return 0; 
} 
+0

이 질문에는 C++ 태그가 없어야합니다. "암시 적 int"로 선언되지 않은 함수. –

+0

와우 !!! 그게 진짜 이유 야! 적절한 로그 기능을 찾을 수 없다면 컴파일러가 무엇을하고 있는지 궁금합니다. 적절한 함수를 찾을 수 없다면 나는 링커 에러를 예상했을 것이다 .... 하, 심지어 C에서 코딩의 2 년 후, 무슨 멍청한 놈이야 !!! 감사합니다. Michael, 많은 도움이되었습니다. :) – Microkernel

+0

@Microkernel 만약 당신이 C++이나 ANSI C로 컴파일한다면이 코드는 컴파일되지 않을 것입니다. –

0

보인다. 결과를 어떻게 인쇄하고 있습니까? printf 문을 사용하는 경우 형식 문자열이 올바른지 확인하십시오.

그것은 this example처럼 가야한다 :

printf ("log(%lf) = %lf\n", somevalue, temp); 
+0

나상근과 위의 진술로 나에게 -1.21881을 준다. – DumbCoder

+2

-1.21881이 올바른 출력입니다 –

+0

아니요, 프로그램을 단계별로 실행하는 동안 조사 식 창을 사용하고 있습니다 ... 답장을 보내 주셔서 감사합니다 : – Microkernel

관련 문제