programing

pow()는 여기서 하나씩 나온 것 같습니다.

copyandpastes 2023. 6. 15. 22:51
반응형

pow()는 여기서 하나씩 나온 것 같습니다.

여기서 무슨 일이 일어나고 있습니까?

#include <stdio.h>
#include <math.h>
int main(void) {
    printf("17^12 = %lf\n", pow(17, 12));
    printf("17^13 = %lf\n", pow(17, 13));
    printf("17^14 = %lf\n", pow(17, 14));
}

다음과 같은 출력이 표시됩니다.

17^12 = 582622237229761.000000
17^13 = 9904578032905936.000000
17^14 = 168377826559400928.000000

13과 14는 울프램 alpacf와 일치하지 않습니다.

12: 582622237229761.000000
    582622237229761

13: 9904578032905936.000000
    9904578032905937

14: 168377826559400928.000000
    168377826559400929

게다가, 그것은 어떤 이상한 부분에 의해 틀린 것이 아닙니다 - 정확히 하나에 의해 틀린 것입니다!

만약 이것이 내가 무엇의 한계에 도달하는 것에 달려 있다면,pow()저를 위해 할 수 있습니다, 이것을 계산할 수 있는 대안이 있나요?는 나는계산수있필함요다니합수를 계산할 수 있는 합니다.x^y서, 디에어x^y입니다. ULLONG_MAX는 ULLONG_MAX입니다.

pow와 함께 작동합니다.double숫들자 * . 이들은 * 2^e 형식의 숫자를 나타냅니다. 여기서 s는 53비트 정수입니다. 그므로러.double는 2^53보다 작은 모든 정수를 저장할 수 있지만 2^53보다 큰 일부 정수만 저장할 수 있습니다.특히, e > 0의 경우 값이 항상 2의 배수이기 때문에 2^53보다 큰 짝수만 나타낼 수 있습니다.

17^13은 정확하게 표현하기 위해 54비트가 필요하므로 e는 1로 설정되어 계산된 값이 짝수가 됩니다.정확한 값은 홀수이므로 하나씩 떨어지는 것은 놀라운 일이 아닙니다.마찬가지로 17^14는 58비트를 사용하여 표현합니다.그것 또한 하나에 의해 어긋난다는 것은 행운의 우연이다(너무 많은 숫자 이론을 적용하지 않는 한), 그것은 단지 32의 배수에서 하나 떨어져 있을 뿐이다, 그것은 그것의 입도입니다.double그 크기의 숫자는 반올림됩니다.

정확한 정수 지수를 얻으려면 정수를 항상 사용해야 합니다.만의 글을 ㅠㅠㅠdouble-자유 지수화 루틴.다음과 같은 경우 제곱을 사용하여 지수화 사용y크기가 클 수도 있지만, 항상 64보다 작다고 생각하기 때문에 이 문제는 해결되지 않습니다.

은숫자커문나수없다습니로 될 수 .double이중 최대 53개의 정수를 모두 있습니다.2^53또는 9,007,199,254,740,992.

큰 숫자의 경우 마지막 숫자가 잘리고 계산 결과가 다음 숫자로 반올림됩니다.double.위해서17^13이것은 한계보다 약간 높은 것으로, 이것은 가장 가까운 짝수입니다.다 큰숫경우보다 큰 2^54이것은 4로 나눌 수 있는 가장 가까운 숫자입니다, 등등.

음이 아닌 정수라면, 의 약당입인음정아당, 자것있다수구습니현을면할만을 할 수 있습니다.pow.

재귀적:

unsigned long long pow(unsigned long long x,unsigned int y)
{
    if (y == 0)
        return 1;
    if (y == 1)
        return x;
    return pow(x,y/2)*pow(x,y-y/2);
}

반복:

unsigned long long pow(unsigned long long x,unsigned int y)
{
    unsigned long long res = 1;
    while (y--)
        res *= x;
    return res;
}

효율적:

unsigned long long pow(unsigned long long x,unsigned int y)
{
    unsigned long long res = 1;
    while (y > 0)
    {
        if (y & 1)
            res *= x;
        y >>= 1;
        x *= x;
    }
    return res;
}

x86 아키텍처에서는 일반적으로 x87 80비트 확장 포맷을 사용할 수 있으며, 이 포맷은 대부분의 C 컴파일러에서 지원됩니다.이 형식을 사용하면 다음과 같은 정수로 작동할 수 있습니다.2^64빈틈없이

의 유사점이 있습니다.pow()<math.h>운영을 위한 것입니다.long double- 자숫 -powl()다 음대형지주합니다의야해도의 .long double은 " " 값다값다릅다니과음이다▁for니다▁is" 이외의 입니다.double- 나하 -%Lf그래서 올바른 프로그램을 사용합니다.long double유형은 다음과 같습니다.

#include <stdio.h>
#include <math.h>
int main(void) {
    printf("17^12 = %Lf\n", powl(17, 12));
    printf("17^13 = %Lf\n", powl(17, 13));
    printf("17^14 = %Lf\n", powl(17, 14));
}

Stephen Canon이 논평에서 언급했듯이 이 프로그램이 정확한 결과를 제공해야 한다는 보장은 없습니다.

언급URL : https://stackoverflow.com/questions/21452711/pow-seems-to-be-out-by-one-here

반응형