以下の内容はhttps://kan-kikuchi.hatenablog.com/entry/BigIntegerより取得しました。


Unity(C#)でlongでも扱えない巨大な桁の整数が扱えるBigInteger【Unity】【C#】




この記事でのバージョン
Unity 6000.3.2f1


はじめに

Unity(C#)で整数値を扱う場合、基本的にはintを使いますが、

あまりに扱える範囲を超えてしまうとオーバーフローが発生してしまいます。

int max   = int.MaxValue;//intの最大値を入れる
int max_1 = max + 1;//最大をこえてるのでオーバーフローしてマイナスになる
Debug.Log($"int.MaxValue     = {max}");
Debug.Log($"int.MaxValue + 1 = {max_1}");


intよりさらに大きな桁を扱えるlongもありますが、

今回はさらにそれ以上大きな桁を扱い時に使えるBigIntegerの紹介です!


BigInteger

BigIntegerはintやlongと違い、必要に応じて内部表現を拡張するため、

なんと桁数に上限がありません。(メモリや処理時間の制約で実質的な上限はある)



使い方は以下のような感じで生成時は文字列から生成するのが定番ですが、

それ以外はintやlongなど同じように使えます。

using System.Numerics;//BigIntegerを使うのに必要
//intでは表現できない桁の数(文字列から生成するのが定番)
BigInteger big = BigInteger.Parse("99999999999999999999999999999999999999");
Debug.Log($"big = {big}");

//さらに計算もできる(桁が増える)
BigInteger big2 = big * 123456789;
Debug.Log($"big2 = {big2}");

// intだとこういう値はそもそも格納できない(コンパイルエラーになる)
// int n = 999999999999999999; //エラー


ただし、BigIntegerは桁が増えるほど計算が多くなるため、場合によっては加算ですら重くなります。

なので、Updateで短時間に何度も計算するような使い方には不向きです。


また、Unityのシリアライズにも対応してないためInspectorに表示する事は出来ません。

なので、保存したい時はstringに変換し、そこから復元して使うような運用になるかと思います。


こんな感じで、巨大な桁が扱えるものの使い勝手が良いわけではないので、

longでも足りず、他の表現方法も厳しい、どうしても巨大な整数を表現したい時だけ使う感じになります






以上の内容はhttps://kan-kikuchi.hatenablog.com/entry/BigIntegerより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14