bestsource

n=5일 때 내 컴파일러와 OS로 pow(n,2)가 24를 반환하는 이유는 무엇입니까?

bestsource 2023. 10. 11. 20:51
반응형

n=5일 때 내 컴파일러와 OS로 pow(n,2)가 24를 반환하는 이유는 무엇입니까?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int n,i,ele;
    n=5;
    ele=pow(n,2);
    printf("%d",ele);
    return 0;
}

출력은24.

코드:: GNU/GCC를 사용하고 있습니다.블록들.

무슨 일입니까?

알아요.pow함수는 a를 반환합니다.double,그렇지만25int 타입에 들어맞는데 왜 이 코드는 a를 출력합니까?24대신에25? 만약에n=4; n=6; n=3; n=2;코드는 작동하지만 5개의 경우에는 작동하지 않습니다.

여기서 발생할 수 있는 일이 있습니다.당신은 당신의 컴파일러의 구현을 보고 이것을 확인할 수 있을 것입니다.pow함수:

올바른 #include's를 가지고 있다고 가정하면 (이에 대한 이전의 답변과 코멘트가 모두 정확합니다) -- 를 받아들이지 마십시오.#include파일 당연), 표준 프로토타입pow함수는 다음과 같습니다.

double pow(double, double);

그리고 당신은 전화를 합니다.pow다음과 같이:

pow(5,2);

pow함수는 알고리즘(로그를 사용하는 probably)을 거치기 때문에 부동 소수점 함수와 값을 사용하여 거듭제곱값을 계산합니다.

pow함수는 또한 계산해야 하기 때문에 순진한 "x의 값을 총 n번 multiply하라"는 과정을 거치지 않습니다.pow분수 지수를 사용하면 분수 거듭제곱을 계산할 수 없습니다.

그래서 더 많은 가능성이 있습니다.pow모수 5와 2를 사용하면 약간의 반올림 오류가 발생했습니다.에 할당한 경우int, 분수 값을 절단하여 24를 산출했습니다.

정수를 사용하는 경우 필요한 횟수만큼 값을 단순히 곱하는 자신의 "intpow" 또는 유사한 함수를 작성할 수 있습니다.이점은 다음과 같습니다.

  1. 다음을 사용하여 미묘한 반올림 오류가 발생할 수 있는 상황은 발생하지 않습니다.pow.

  2. 당신의.intpow기능은 동일한 호출보다 더 빨리 실행될 가능성이 높습니다.pow.

2배수를 위한 함수의 결과값을 구하려고 합니다.

당신은 아마도 사용해야 할 것입니다.

ele=(int)(0.5 + pow(n,2));
/*    ^    ^              */
/* casting and rounding   */

부동 소수점 산술은 정확하지 않습니다.

비록 작은 값들이 정확히 더하고 뺄 수 있지만,pow()함수는 일반적으로 로그를 곱하여 작동하므로 입력이 모두 정확하더라도 결과는 그렇지 않습니다.할당 대상int항상 잘라내기 때문에 부정확성이 음수이면 25가 아니라 24가 됩니다.

이 이야기의 교훈은 정수에 정수 연산을 사용하고 의심하는 것입니다.<math.h>실제 인수가 승격되거나 잘릴 때 함수입니다.유감스럽게도 GCC는 추가하지 않으면 경고를 하지 않습니다.-Wfloat-conversion(들어있지 않음)-Wall -Wextra일 것입니다 입니다).

() 나눗셈을 사용하는 더 하고 빠릅니다.pow() -오!그러나, 범람의 위험에 유의해야 합니다.

과 같습니다.double하는 중입니다.int자릅니다.

이할 수 .pow.double아니면float변수.

그래서 기본적으로

번역하면 다음과 같습니다.exp(log(x) * y)입니다와 낼 다x^y에 가깝습니다. -다.를 들면면.5^2 될 것입니다.24.9999996아니면25.00002

언급URL : https://stackoverflow.com/questions/25678481/why-does-pown-2-return-24-when-n-5-with-my-compiler-and-os

반응형