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
'programing' 카테고리의 다른 글
Vuexgetter를 사용하여 하나의 요소를 검색하는 동안 오류가 발생했습니다. (0) | 2023.06.15 |
---|---|
oEmbed Wordpress 표시 오류 (0) | 2023.06.15 |
data.table의 열 클래스 변환 (0) | 2023.06.15 |
같은 ASP에 대한 여러 AJAX 콜이 동시에 이루어지는 이유는 무엇입니까?NET MVC 작업으로 인해 브라우저가 차단됩니까? (0) | 2023.03.27 |
복수의 디렉티브[ 디렉티브 #1, 디렉티브 #2]에 대해 격리된 범위를 요구하는 (0) | 2023.03.27 |