2017-03-23 18 views
-4

설명하십시오 (당신이 그것을 잘 작동 pow(long long int a, long long int b) 대신 pow(double a, double b)의의 프로토 타입과 펑 함수를 작성합니다.) 여기 큰 숫자를 사용할 때 함수 pow()가 올바르게 작동하지 않습니까? 펑은()? 큰 수와 같은 2^63 작동하지 않는 이유

코드입니다 :

#include <stdio.h> 
#include <math.h> 
int main() 
{ 
    printf("%.0lf\n" ,pow((double)2,63)); 
} 

출력 :

9223372036854775800 

진정한 답 :

9223372036854775808 

감사합니다.

+0

[mcve]를 질문의 일부로 포함하십시오. –

+3

"올바르게 작동하지 않음"을 정의하십시오. 실제 출력이 이상적입니다. – fvu

+0

다른 유형의 의미를 알고 있습니까? –

답변

0

pow이 정상적으로 작동합니다. MSVC의 printf은 버그가 있으며 부동 소수점에 대한 출력이 잘립니다.

+0

왜 downvote? '9223372036854775800'는'double'에서 표현할 수있는 값이 아니므로'pow'가 리턴 한 것이 아닙니다. 그것이 나타날 수있는 유일한 방법은 잘못 인쇄하는'printf'로,이 버그로 알고있는 유일한 구현은 MSVC입니다. –

+0

@ R .. 나는 당신에게 downvote 줄지 않았다 !! –

+0

@FatemehKarimi @vatemehKarimi 나는 downvote도하지 않았지만 컴파일러/라이브러리 (MSVC이든 아니든 사용중인 버전)와 컴파일하는 방법 등을 업데이트하여 그보다 더 도움이 될 수 있습니다. –

4

printf("%.0lf\n", x);정확히 값을 (double) x으로 인쇄 할 필요가 없습니다.

호환되는 C 컴파일러/표준 C 라이브러리는 DBL_DECIMAL_DIG (일반적으로 17)을 인쇄 할 코드를 생성하며 중요한 십진수를 수정하십시오. 기타는 더 많은 숫자를 올바르게 인쇄 할 수 있습니다. (광산 인쇄 된 9223372036854775808). <float.h>

// 456789
9223372036854775800 // answer 
9223372036854775808 // true answer: 

익스트림 예

DBL_MAX 특정 시점 이후 0을보고합니다 printf("%.0lf\n" ,DBL_MAX);exact value

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 

그러나 많은 결과가있을 수 있습니다 참조

179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
,536,

OP later added 참조 번호 pow()의 기능은 long long int pow(long long int a, long long int b)입니다. pow_ll_version(2,63)9223372036854775808이 될 것으로 예상되며, 이는 많은 수의 1을 초과합니다. LLONG_MAX - 확실히 정의되지 않은 동작입니다. 에서 -9223372036854775808으로 감싸고 printf("%llu\n" , long_long_int_result); (더 일치하지 않는 지정자와 유형으로 더 많은 UB)로 인쇄했다고 가정합시다. 이것은 OP에 9223372036854775808을 부여했을 수 있습니다.

printf() 정수 출력은 부동 소수점 값과 정확하게 일치하지 않습니다.

+1

** 컴파일러 **는 아무 것도 인쇄하지 않습니다. 이것은 표준 라이브러리, 즉 환경의 구현입니다. – Olaf