【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18504

多倍長でe
投稿者---HH(2004/12/05 14:26:54)


初めまして。
自然対数の底(e)を小数点以下任意の桁(10000くらい)求めるプログラムを多倍長を使って作りたいのですが、多倍長についてよく理解できません…簡単なソースや解説をお願いできませんか?ぜひお願いします m(__)m


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:多倍長でe 18505 ぽこ 2004/12/05 14:32:37
<子記事> Re:多倍長でe 18613 かずま 2004/12/09 18:44:59


No.18505

Re:多倍長でe
投稿者---ぽこ(2004/12/05 14:32:37)


>簡単なソースや解説をお願いできませんか?ぜひお願いします m(__)m

以下のホームページを参考にしてみては?
http://www5.airnet.ne.jp/tomy/cpro/csource.htm


この投稿にコメントする

削除パスワード

No.18613

Re:多倍長でe
投稿者---かずま(2004/12/09 18:44:59)


> 自然対数の底(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;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧