質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

意見交換

クローズ

4回答

907閲覧

C++で扱える大きな数値は何なのかを知りたい

michikusa-mc

総合スコア26

1グッド

1クリップ

投稿2023/07/02 02:07

編集2023/07/02 04:31

1

1

知りたいこと

C++で扱える一番大きな数値について
C++でとても大きな数を扱うにはどうすればいいでしょうか...?
僕が知っているのは unsigned __int64 という型なのですが、それ以上に大きな数を知りません。

背景、状況

円周率を計算していくプログラムを作りたかったのですが、どうしても桁数に制限があるため
完璧にすることができません。そこでそこそこ大きい数を生成する為にどうすればいいかを募集してみました。

制約

  • 正の数である (自然数、正の浮動小数点かは問いません)
  • C++で扱える

特にツールなどの制限は問いませんので、ご意見よろしくお願いします!

追記:試したこと

「調査したこと・試したことが記載されていない質問」とご指摘を受けました。ありがとうございます。

  • 数値を文字列として扱う

c++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5int main(void) { 6 string n = "1234789452315541318781321897897451354894865132189485616579845646546515649845848915618948691891978943216549846135486748465"; 7 cout << n << endl; 8 return 0; 9}

この方法は無理矢理なうえに、計算アルゴリズムが大変な事になるので止めました。

  • unsigned __int64を複数使用する方法

c++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5int main(void) { 6 __int64 x = 12345678987654321; 7 __int64 y = 1234567890; 8 9 // 123456789876543211234567890 10 cout << x << y << endl; 11 return 0; 12}

この方法がいいと思ったのですが、円周率を計算するプログラムなので扱いにくいので断念。

初心者ですみませんが、改めてご意見お願いします。

kiri_.o👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答4

#1

fana

総合スコア11658

投稿2023/07/02 02:15

1byte の型を2つ用いて 2byte の型のように振舞わせる実装 ができるとしたら,
同じ事を uint64_t 型とかを用いて好きなだけ巨大なものを作ればよいのではないかと想像します.

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

melian

総合スコア19816

投稿2023/07/02 03:07

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

ikedas

総合スコア4335

投稿2023/07/02 06:51

真っ正直に「大きな桁数の数値を扱いたい」というのなら、すでに紹介されているような、そういうものを扱える方法を探すか作るかすればいいと思います。「扱いにくい」とおっしゃいますが、それが実際に行われていることです。

ところで、そんな大きな桁数の数が必要になるのはなぜなんでしょうか。もしかして、「小数点以下1000桁目まで計算すると決めたら、小数点以下1000桁までの数をコンピュータで扱えないといけない」と考えておられるのでしょうか。

もしもそうなら、円周率を100兆桁計算する (昨年に実際に計算されています) ためには、最低でも約100テラバイトのメモリを積んだコンピュータが必要ですね。計算の途中結果のためのメモリも必要ですからその数倍は必要ということでしょうか。絶対に不可能とは言いきれませんが、ちょっと現実ばなれしていますよね。

一方、以前ネット上で少し話題を呼びましたが、円周率を一桁づつ順番に出力していくプログラムというのもあります。プログラムの短かさにも驚かされますが、その内容も驚きです。計算途中で使われる変数が全部int型なのです。しかもよく調べてみると、2400桁を出力するまでに各変数のうち一番大きくなるものでも2147483643にしかなっていません。32ビットマシンでも実行可能なのです (ただしこのアルゴリズムでは、出力する桁数に比例した量のメモリが必要です)。

円周率の計算について調べておられて、いろいろなアルゴリズムがあることもご存じだと思います。たしかにある程度の桁数まで計算しようとすれば、計算途中で大きな数を扱わなければならないケースはあります。しかしそれも、できるだけ大きくならないようなアルゴリズム上の工夫を積み重ねた上でのことです。そのあたりについても調査されてみてはいかがでしょうか。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問