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