回答編集履歴
1
多倍長計算のコードを追加
answer
CHANGED
@@ -1,3 +1,36 @@
|
|
1
1
|
double の精度は 2進で 53ビット。これを 10進に換算する約16桁です。
|
2
2
|
先頭から16桁までが有効数字。
|
3
|
-
後の桁は、2進の54ビット目以降が全部0 だとして10進数に変換したものです。
|
3
|
+
後の桁は、2進の54ビット目以降が全部0 だとして10進数に変換したものです。
|
4
|
+
|
5
|
+
**追記**
|
6
|
+
数値を int の配列で保持し、1つの要素に10進 4桁を入れる多倍長計算をしてみました。
|
7
|
+
```C
|
8
|
+
#include <stdio.h>
|
9
|
+
|
10
|
+
#define N 6 // (4 * N)桁までの数値
|
11
|
+
|
12
|
+
void print(const int *a)
|
13
|
+
{
|
14
|
+
int i = N;
|
15
|
+
while (--i > 0 && a[i] == 0) ;
|
16
|
+
printf("%d", a[i]);
|
17
|
+
while (--i >= 0) printf("%04d", a[i]);
|
18
|
+
putchar('\n');
|
19
|
+
}
|
20
|
+
|
21
|
+
void power(int x, int y, int *a) // a = pow(x, y)
|
22
|
+
{
|
23
|
+
a[0] = 1;
|
24
|
+
for (int i = 1; i < N; i++) a[i] = 0;
|
25
|
+
for (int i = 0; i < y; i++)
|
26
|
+
for (int c = 0, j = 0; j < N; j++)
|
27
|
+
a[j] = a[j] * x + c, c = a[j] / 10000, a[j] %= 10000;
|
28
|
+
}
|
29
|
+
|
30
|
+
int main(void)
|
31
|
+
{
|
32
|
+
int a[N];
|
33
|
+
power(17, 17, a);
|
34
|
+
print(a);
|
35
|
+
}
|
36
|
+
```
|