|
> 自然対数の底(e)を小数点以下任意の桁(10000くらい)求める
> プログラムを多倍長を使って作りたいのですが、多倍長についてよく理解
> できません…簡単なソースや解説をお願いできませんか?
参考となる Web page が紹介されているのに、どうなっているのでしょうか?
問題が解決したのかどうかの報告をしない質問者が多いように思います。
さて、簡単なソースを示しますが、解説が欲しければ、このソースについて
質問をしてください。
#include <stdio.h>
#include <string.h>
#define N 10000
void inc(char *a)
{
int i;
for (i = 0; i < N && ++a[i] >= 10; i++)
a[i] -= 10;
}
void add(char *a, const char *b, int n)
{
int i, carry = 0;
for (i = 0; i < n; i++) {
a[i] += b[i] + carry;
carry = (a[i] >= 10);
if (carry) a[i] -= 10;
}
}
int sub(char *a, const char *b, int n)
{
int i, borrow = 0;
for (i = 0; i < n; i++) {
a[i] -= b[i] + borrow;
borrow = ((unsigned)a[i] >= 10);
if (borrow) a[i] += 10;
}
return borrow;
}
int divide(char *a, const char *b)
{
int i; char x[2*N];
memcpy(x, a, N); memset(x + N, 0, N);
for (i = N; --i >= 0; ) {
for (a[i] = 0; a[i] < 10; a[i]++)
if (sub(x + i, b, 4)) break;
add(x + i, b, 4);
}
return 0;
}
void put_val(const char *msg, const char *a, const char *msg2)
{
int i = N;
if (msg) fputs(msg, stdout);
printf("%d.", a[--i]);
do putchar(a[--i] + '0'); while (i);
if (msg2) fputs(msg2, stdout);
}
int is_zero(const char *a)
{
int i;
for (i = 0; i < N; i++)
if (a[i]) return 0;
return 1;
}
char e[N] = {0}, t[N] = {0}, i[N] = {1};
int main(void)
{
int k;
t[N-1] = 1;
for (k = 0; !is_zero(t); k++) {
fprintf(stderr, "\r%d", k);
add(e, t, N), divide(t, i), inc(i);
}
put_val("\n", e, "\n");
return 0;
}
|