none
数値型の作り方 RRS feed

  • 質問

  • 自分でDecimal型より大きい数が入る型を作ってみたいのですが、作り方が全然分かりません。誰か分かる方は教えて下さい。
    2013年5月23日 8:58

すべての返信

  • 目的は何でしょうか? 作り方を学ぶのであれば、「全然わかりません」ではなく分かる範囲・わからない範囲を明確にしましょう。特に何が作りたいのかは質問者さんにしかわかりません。数が入るだけでいいのか、四則演算もしたいのか、小数も扱いたいのか、そういったゴールです。
    また「大きい数」にもいろいろあります。有効桁数を必要としないのであればDoubleもあります。

    2013年5月23日 9:09
  • 「多倍長」とか、「任意精度演算」とか、先人の知識を頼るところから始めてください。
    2013年5月23日 13:47
    モデレータ
  • 管理する値が「整数」で構わないのであれば、BigInteger 型 を使うのが楽かと思います(VS2008以下では使えません)。

    しかし整数以外の実数も表したいとなると、実装は大変かもしれません。
    とりあえずは、先の BigInteger を2つペアにして、「分数」として分子と分母で管理する手がありますね。
    分数同士の四則演算は、小学校で習っているはずなので、考え方は既にご存知かと思います(それをプログラミングするとなると面倒ですが)。

    BigInteger が使えないバージョンであれば、それぞれの桁を「配列」で管理したり、あるいは「数字を並べた文字列」で管理する手法があります。
    この場合の四則演算では、いわゆる「筆算」の要領で一桁ずつ四則演算することになりますね。

    このほか、「固定小数」あるいは「浮動小数」として扱う考え方もあります。

    ……というように、巨大な値をどのように管理するかについては、いろいろな手法があります。
    VB5 向けの古い記事ですが、下記が考え方の助けになるかもしれません。
    http://salvw.miscnotes.com/index.php/archives/49


    ちなみに System.Decimal の場合、型全体としては128bitですが、内部的には 96bit の整数として管理されています。
    そこに「正負の符号」を表す1bit と、小数点の位置情報が管理情報として加わったデータ型です。

    96bit整数の場合、0~79,228,162,514,264,337,593,543,950,335 の範囲を表せます。
    10進数で見ると最大28桁なので、小数点の位置は0~28の範囲で管理されます。

    このため Decimal 型で表現可能な最大精度としては、
    0.0000000000000000000000000001 が0より大きい最小の値で、 
    79228162514264337593543950335. が最大の数値となります。
    整数部の桁数が増えるにつれ、小数部の精度が低下するデータ型ですね。

    .NET から離れて、COM の VARIANT 型というものに目を向けてみると、Decimal 型や Currency 型という表現があります。
    COM の Decimal は、.NET の Decimal と同じ構造になっています。

    一方 Currency は固定小数点の一種であり、内部的には64bitの符号付整数として管理されています。
    そのうちの 1bitは符号桁であるため、値そのものは63bit で表現されます。
    この範囲で表されるのは、0~9,223,372,036,854,775,807 という数値ですが、Currency では、これを10000で割った値として扱います。言い換えると、右から4桁目に小数点を打った値として扱うということです。
    この Currency 型で表現可能な最大精度の値では、
    000000000000000.0001 が0より大きい最小の値で、
    922337203685477.5807 が最大の数値となります。
    先の Decimal とは異なり、小数部の精度が変化することはなく、常に小数部が4桁固定というデータ型です。

    また、 Single/Doubleに代表される浮動小数点型ですが、こちらは整数ではなく、二進小数として管理されています。

    2013年5月23日 13:48
  • 自作にこだわらないなら、他の人が作成されたものを使うという選択肢もあります。
    今回は「作ってみたい」ということだったので、方向性からは外れるかもしれませんが…。

    http://www.vector.co.jp/soft/winnt/prog/se499760.html
    http://bigdecimal.codeplex.com/
    http://coderjournal.com/2012/05/bigdecimal-type-in-net/

    2013年5月23日 14:03
  • 以下が手掛かりになるかもしれません。

    Microsoft Excel 上に大きな整数とその演算関数を導入する
    http://ci.nii.ac.jp/naid/110008712220

    Microsoft Excel の上に大きな有理数とその演算関数を実現する
    http://ci.nii.ac.jp/naid/110008712221

    How can I get more than 100 decimal digits in C#?
    http://stackoverflow.com/questions/7887774/how-can-i-get-more-than-100-decimal-digits-in-c

    BigRational     #上記のページでも紹介されています。
    http://bcl.codeplex.com/wikipage?title=BigRational


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年5月23日 14:03
    モデレータ