(Translated by https://www.hiragana.jp/)
任意精度演算 - Wikipedia コンテンツにスキップ

任意にんい精度せいど演算えんざん

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
多倍たばいちょう整数せいすうから転送てんそう

任意にんい精度せいど演算えんざん(にんいせいどえんざん)[1]とは、数値すうち精度せいど必要ひつようならいくらでもばしたりできるような演算えんざんシステム(実際じっさいじょう利用りよう可能かのうメモリ容量ようりょう制限せいげんされるが)による演算えんざんである。

概要がいよう

[編集へんしゅう]

多倍たばいちょう整数せいすう(たばいちょうせいすう)などを内部ないぶ処理しょり利用りようし、必要ひつよう桁数けたすう浮動ふどう小数点しょうすうてん計算けいさんおこなう。固定こていちょう整数せいすう一般いっぱんてき固定こてい精度せいど浮動ふどう小数点しょうすうてん方式ほうしきは、ハードウェアで高速こうそく処理しょりできるのにたいし、任意にんい精度せいど演算えんざんはソフトウェアで実装じっそうされ、おも処理しょり必要ひつようとする。じゅうしんの0.1を2しん表現ひょうげんしようとする場合ばあいのように、有限ゆうげん桁数けたすうでは表現ひょうげんれない場合ばあいもあることから、2しんでなくじゅうしん処理しょりするものや、有理数ゆうりすう演算えんざん併用へいようしたりもする。

多倍たばいちょう演算えんざん(たばいちょうえんざん)[2]ともうが、プログラミング言語げんごによっては、多倍たばいちょう整数せいすう (とく区別くべつする場合ばあいbigint などとう) の名前なまえbignum であることもある。

最近さいきんのプログラミング言語げんごなかには、多倍たばいちょう整数せいすう言語げんご仕様しようでサポートしているものもあり、言語げんごでも多倍たばいちょう整数せいすう任意にんい精度せいど浮動ふどう小数点しょうすうてんすうあつかうライブラリが存在そんざいする。任意にんいちょう配列はいれつ格納かくのうするような実装じっそうになっている。

任意にんい精度せいど演算えんざんは、演算えんざん速度そくど重要じゅうようされない用途ようとおおきなかずについての正確せいかく演算えんざん結果けっか必要ひつようとする場合ばあい使つかわれる。

数式すうしき処理しょりシステムとのちが

[編集へんしゅう]

数式すうしき処理しょりシステム記号きごう計算けいさん代数だいすう処理しょり)では、たとえば a + b というしきはそういう記号きごうによるしきのまま表現ひょうげんし、たとえばその3ばい代数だいすう法則ほうそくしたが3a + 3b のように処理しょりするので、任意にんい計算けいさん可能かのうすう無限むげん精度せいどで「表現ひょうげん」できるが、任意にんい精度せいど演算えんざんとはことなったものである。しかし、個々ここ数式すうしき処理しょりシステムの設計せっけいしゃかんが次第しだいであるが、数式すうしきからシームレスに、あるいは明確めいかくなアクションをて、任意にんい精度せいど演算えんざん有理数ゆうりすう演算えんざんつなげられるものもある。

用途ようと

[編集へんしゅう]

典型てんけいてき用途ようととしてすうひゃくからすうせんけた整数せいすう演算えんざん必要ひつようとする、公開こうかいかぎ暗号あんごうがある。また、人間にんげん中心ちゅうしんのアプリケーションで桁数けたすう制限せいげんやオーバフローが不適切ふてきせつ場合ばあいにも使用しようされる。また、固定こてい精度せいど演算えんざん結果けっかをチェックするのにも使つかえ、方程式ほうていしき係数けいすうたとえばガウスもとめせきてくる など)の最善さいぜん決定けっていするのにも使つかえる。

任意にんい精度せいど演算えんざんは、円周えんしゅうりつなどの基礎きそてき数学すうがく定数ていすうすうひゃくまんけた以上いじょう計算けいさんしてもとめ、その数字すうじれつ特性とくせい解析かいせきするのに使つかったり[3]解析かいせきてき手法しゅほうでは解明かいめいするのがむずかしい関数かんすうたとえば、リーマンゼータ関数かんすう)の正確せいかくいを調しらべるのに使つかったりする。また、マンデルブロ集合しゅうごうなどのフラクタル画像がぞうきわめてたか倍率ばいりつえが場合ばあいにも任意にんい精度せいど演算えんざん必要ひつようとなる。

任意にんい精度せいど演算えんざんは、固定こてい精度せいど演算えんざんではけられない算術さんじゅつオーバーフローふせぐために使つかうこともある。4けた走行そうこう距離きょりけいが9999のつぎは0000にもどるように、固定こてい精度せいど整数せいすうがたでは、数値すうち固定こてい精度せいどあらわせる範囲はんいえると循環じゅんかんするようにもっとちいさいもどってしまう。「循環じゅんかん」させずに「飽和ほうわ」させる方式ほうしきのプロセッサもあり、演算えんざん結果けっか表現ひょうげんできない数値すうちになった場合ばあいに、表現ひょうげん可能かのうもっとちか置換ちかんしてしまう(たとえば、16ビット符号ふごうなし整数せいすうなら、65535 に 1 をしても 65535 のままとなる)。プロセッサによっては例外れいがい発生はっせいさせることもできる。必要ひつようなら例外れいがいをひきとって、ソフトウェアが任意にんい精度せいど演算えんざんえるということも可能かのうである。

コンピュータのおおくは整数せいすうとして32ビットや64ビットを使つかうのが通例つうれいで、アプリケーションはオーバーフローをこさないよう注意ちゅういしてプログラミングしなければならない。しかし、たとえば配列はいれつのサイズをあつかっているのであれば、そのようなバグをむのはバイトの巨大きょだい配列はいれつときだけであり、しばしばわすれられている。たとえば、二分にぶん探索たんさくのコードとして大抵たいてい参考さんこうしょでそのようにかれており、実際じっさい世界中せかいじゅうひろ使つかわれていたコードで (L + R) / 2 というしき計算けいさんおこなっていた。固定こていちょう場合ばあいこの計算けいさん結果けっかL + R がオーバーフローしたときただしくないものとなる。しかし、もし任意にんいちょう整数せいすう計算けいさんであったなら、このしきのままで問題もんだいないわけである。

LISPREXXPythonPerlRuby といったプログラミング言語げんごでは、整数せいすう演算えんざん範囲はんい固定こていちょう範囲はんいえるものを、自動的じどうてき多倍たばいちょう整数せいすうにフォールバックする(オプションの場合ばあいもある)。性能せいのうてきには不利ふりだが、演算えんざん結果けっかがオーバーフローで不正ふせい(または例外れいがい)になる可能かのうせい排除はいじょできる。また、ワードサイズのことなる機種きしゅあいだでも演算えんざん結果けっかつねおなじになることを保証ほしょうできる。プログラミング言語げんご多倍たばいちょう整数せいすうをサポートすると、言語げんご単純たんじゅんでき、様々さまざまなデータがた用意よういする必要ひつようがないという利点りてんもある。理論りろんてきには、最適さいてきにおいて数学すうがくてきしき変形へんけい可能かのうになる、という利点りてんもあるが、実際じっさいとしてはフォールバックによる性能せいのう低下ていかのほうがいてくる。

実装じっそうじょう問題もんだい

[編集へんしゅう]

任意にんい精度せいど演算えんざんは、プロセッサのレジスタのおおきさにわせた数値すうちがた演算えんざんより大幅おおはば性能せいのうおとる。固定こてい精度せいど演算えんざんハードウェアでの実装じっそう比較的ひかくてき容易よういであるのにたいして、任意にんい精度せいど演算えんざんはメモリ管理かんりなどソフトウェア実装じっそうしなければならない部分ぶぶんがある(多倍たばいちょうないし任意にんい精度せいど演算えんざんのハードウェアサポートは過去かこひろくみられる)。整数せいすう除算じょざん浮動ふどう小数点しょうすうてん演算えんざんはサポートしていないプロセッサもあるが、ソフトウェアでそれらをサポートするとしても通常つうじょうは1ワードまたは2ワードの数値すうちがた使つかい、任意にんいちょう処理しょりおこなわない。

一般いっぱん除算じょざんでは循環じゅんかん小数しょうすう発生はっせいすることがある。任意にんい精度せいど演算えんざんではどこかでるか、循環じゅんかんをなんらかのかたち表現ひょうげんするか、有理数ゆうりすう演算えんざん併用へいようする。

多倍たばいちょう整数せいすうであれば任意にんいちょう整数せいすう演算えんざんを、任意にんい精度せいど浮動ふどう小数点しょうすうてんであれば任意にんい精度せいど浮動ふどう小数点しょうすうてん処理しょりをおこなう。任意にんい精度せいどすうおおきさは使用しよう可能かのう記憶きおく装置そうち容量ようりょう制限せいげんされるだけでなく、数値すうちあらわ配列はいれつのインデックスのサイズでも制限せいげんされる。一般いっぱんにインデックスは固定こていちょうである。

任意にんい精度せいど数値すうち演算えんざん効率こうりつてきおこなうためのアルゴリズムがいくつも考案こうあんされてきた。とくに、桁数けたすう としたとき、おおきい場合ばあい計算けいさんりょう最小さいしょうにするようなアルゴリズムが必要ひつようとされる。

加算かさん減算げんざんもっと単純たんじゅんなアルゴリズムは、単純たんじゅんけたごとに順次じゅんじ加算かさん減算げんざんしていき、げやげを必要ひつようおうじておこなうものである。この計算けいさんりょう である(ランダウの記号きごう参照さんしょう)。

乗算じょうざん場合ばあいもっと単純たんじゅんなアルゴリズムは筆算ひっさん計算けいさん方法ほうほうをそのまま採用さいようする手法しゅほう計算けいさんりょうである。計算けいさんりょう乗算じょうざんアルゴリズムとして、高速こうそくフーリエ変換へんかんもとづくショーンハーゲ・ストラッセンほうSchönhage-Strassen-Algorithmus)がある。また、カラツバほうでは 計算けいさんりょうである。 があまりおおきくない場合ばあい、カラツバほうほう性能せいのうがよい(前者ぜんしゃ性能せいのうつのはすくなくとも1まんけた以上いじょう場合ばあい)。

かいじょう計算けいさんでは、非常ひじょう素早すばや非常ひじょうおおきなかず生成せいせいする。方程式ほうていしきなどではこうとの組合くみあわせで出現しゅつげんするので、評価ひょうか順序じゅんじょ工夫くふうすることで、全体ぜんたい計算けいさんではおおくの場合ばあいテイラー級数きゅうすうなど)それが問題もんだいになることはない。かいじょう近似きんじ必要ひつようなら、スターリングの近似きんじ使つかえばよい。正確せいかく必要ひつようなら、整数せいすうがた限界げんかいをすぐにえることが問題もんだいとなる。浮動ふどう小数点しょうすうてんすうによる近似きんじであってもその最大さいだいえるのは容易よういで、対策たいさくとしてかいじょう対数たいすうによる計算けいさんえる方法ほうほうてくる。

おおきなかいじょう正確せいかくもとめたい場合ばあい特別とくべつなソフトウェアが必要ひつようとなる。以下いか擬似ぎじコードは、11*2(1*2)*3((1*2)*3)*4じゅん計算けいさんしていく手法しゅほう使つかったものである。

program Factorial ;
  type natural = range 1..integer.last of integer ;
  type radical = range 2..integer.last of integer ;
  type COLUMNS_TYPE = record
    const MAX_LENGTH : natural = 1000 ; (* 十分じゅうぶん桁数けたすう上限じょうげんとする *)
    values : array [1:MAX_LENGTH] of natural ;
    length : natural ;
    radix : radical ;
    end ;
  
  procedure factorial (const n : natural, var columns : COLUMNS_TYPE) ;
    begin
    columns.length := 1 ;
    columns.values [columns.length] := 1 ; (* 最初さいしょ乗法じょうほう単位たんいもと 1 を設定せっていする *)
    var carry : integer = 0 ;              (* したくらいからのけたのぼり *)
    for var ci := 1 to columns.length do   (* けたごとにループ *)
      begin
      const c = columns.values [ci] * n + carry ;  (* このけたかずとの乗算じょうざんしたくらいからのけたのぼりの *)
      columns.values [ci] := c mod columns.radix ; (* せき下位かいけた *)
      carry := c div columns.radix ;               (* せき上位じょういけたうえへのけたのぼり *)
      end ;
    while 0 < carry do
      begin
      if COLUMNS_TYPE.MAX_LENGTH <= columns.length then
        raise OverflowError ;
      columns.length := columns.length + 1 ;                       (* けたやす *)
      columns.values [columns.length] := carry mod columns.radix ; (* 実際じっさい格納かくのう *)
      carry := carry div columns.radix ;                           (* つぎへのけたのぼり *)
      (* n が基数きすうよりおおきければ、もう1けた必要ひつようになることがある。 *)
      end
    end ;
  
  procedure writeColumns (var column : COLUMNS_TYPE) ;
    begin
    if 36 < columns.radix then raise OutOfRangeError ;
    const DIGITS : array of character = ['0'..'9','A'..'Z'] ; (* 36しんほうまで対応たいおう可能かのう *)
    for var ci := columns.length downto 1 do
      write (DIGITS [columns.values [ci]]) ; (* おおきいけたから表示ひょうじ *)
    end ;
  
  begin
  for var n := 1 to 35 do
    begin
    var columns : COLUMNS_TYPE ;
    columns.radix := 10 ; (* 10しんほう *)
    factorial (n, columns) ;
    writeColumns (columns) ; writeln (' = !', n)
    end
  end.

このれいで、詳細しょうさいてみよう。もっと重要じゅうようなのは、おおきなかず表現ひょうげん方法ほうほう選択せんたくである。この場合ばあいかいじょう計算けいさんなので整数せいすうだけでよく、固定こてい小数点しょうすうてん方式ほうしき事足ことたりる。基数きすうべきは0からはじまっておおきくなっていくので、配列はいれつ先頭せんとうが0で、うしろのほうほど基数きすうべきおおきくなるという表現ひょうげん便利べんりである。配列はいれつのインデックスの始点してんおおきさの指定してい方法ほうほう言語げんごによってことなるが(0からはじまる言語げんごと1からはじまる言語げんごがある)、一般いっぱん計算けいさん必要ひつよう条件じょうけんには関係かんけいしないので、ここでは単純たんじゅんするために配列はいれつ始点してんを0ではなく1としている。数字すうじ配列はいれつのインデックスがそのけた基数きすうべき対応たいおうするという性質せいしつは、ここでは利用りようしていない。

つぎ重要じゅうよう決定けっていは、基数きすうを10としたことである。この場合ばあい様々さまざまなことを考慮こうりょしなければならない。一時いちじ変数へんすう c は、1つのけた乗算じょうざん結果けっかまえけたせきからのがりをくわえたものを保持ほじしなければならない。基数きすうが10の場合ばあい、16ビット整数せいすうであれば32767まで表現ひょうげんできるので十分じゅうぶんである。ただし、このれいでは n 自身じしんが10を基数きすうとする配列はいれつになっていないというてん若干じゃっかんごまかしている。結果けっかとしてこのれいn > 3200 などと設定せっていするとうまく動作どうさできなくなる。これがこの擬似ぎじコードの暗黙あんもく限界げんかいである。一般いっぱんには nおおきなかずとして配列はいれつあらわ必要ひつようがある。また、このようなごまかしをしたせいで、いちけた乗算じょうざんであっても n 全体ぜんたいをかけているため、がりはつぎけたおさまるとはかぎらず、さらにつぎけたにまで場合ばあいてきた。結果けっか以下いかしめす。けた位置いちわせるため空白くうはくくわえ、さらに注釈ちゅうしゃくくわえてある。

                                                 コンピュータでの数値すうち表現ひょうげん範囲はんい
                                        1 =  1!
                                        2 =  2!
                                        6 =  3!
                                       24 =  4!
                                      120 =  5!   8ビット符号ふごうなし  
                                      720 =  6!
                                     5040 =  7!
                                    40320 =  8!  16ビット符号ふごうなし
                                   362880 =  9!   
                                  3628800 = 10!   
                                 39916800 = 11!   
                                479001600 = 12!  32ビット符号ふごうなし
                               6227020800 = 13!   
                              87178291200 = 14!   
                            1307674368000 = 15!   
                           20922789888000 = 16!   
                          355687428096000 = 17!   
                         6402373705728000 = 18!   
                       121645100408832000 = 19!   
                      2432902008176640000 = 20!  64ビット符号ふごうなし
                     51090942171709440000 = 21!   
                   1124000727777607680000 = 22!   
                  25852016738884976640000 = 23!   
                 620448401733239439360000 = 24!   
               15511210043330985984000000 = 25!   
              403291461126605635584000000 = 26!   
            10888869450418352160768000000 = 27!   
           304888344611713860501504000000 = 28!   
          8841761993739701954543616000000 = 29!   
        265252859812191058636308480000000 = 30!   
       8222838654177922817725562880000000 = 31!
     263130836933693530167218012160000000 = 32!
    8683317618811886495518194401280000000 = 33!
  295232799039604140847618609643520000000 = 34! 128ビット符号ふごうなし
10333147966386144929666651337523200000000 = 35!

もっと実用じつようてきなプログラムをくなら、コンピュータの計算けいさん能力のうりょくをより効率こうりつよく利用りようするものにすべきである。単純たんじゅん改良かいりょうとしては基数きすうを100とするか(対応たいおうして出力しゅつりょくでの変換へんかん必要ひつようになる)、または各種かくしゅ変数へんすうをよりおおきくして(たとえば32ビット整数せいすう)さらに基数きすうおおきく、たとえば10,000にする。じゅうしん以外いがい基数きすうからじゅう進数しんすう出力しゅつりょくへの変換へんかんには多大ただい計算けいさんようする。とはいうものの、コンピュータの本来ほんらいあつかえる整数せいすう限界げんかいちか基数きすう使つかったほう有利ゆうりである。通常つうじょう整数せいすうがたであれば、その中身なかみが6であろうと10000であろうと操作そうさようする時間じかんおなじであり、おおきい格納かくのうしたほう配列はいれつ全体ぜんたいとしてよりおおきなかずあらわせる。コンピュータによっては、せきをそのけたけたのぼり(キャリー)に自動的じどうてきける機能きのうがあり、れいにある moddiv という操作そうさ必要ひつようとしない。たとえば IBM 1130 では16ビット整数せいすう乗算じょうざんせきは32ビットであらわされ、これを2つの16ビット整数せいすうとしてあつかうこともできる。その場合ばあいおおきなかず基数きすうは65536となり、けたのぼりは上位じょうい16ビットで、けた下位かい16ビットということになる。したがって、それらをけるさいmoddiv必要ひつようとしない。

プロセッサには存在そんざいするキャリーフラグなどをあつかえない、などといった理由りゆうから、こういったたぐいのプログラミングには高水準こうすいじゅん言語げんご不適ふてきというめんがあり、機械きかいによるハックによって格段かくだん高速こうそく実装じっそう実現じつげんできる場合ばあいもある。しかし、数値すうち演算えんざんのコードはデバッグのむずかしさもあり、そのあたりのトレードオフもある。高水準こうすいじゅん言語げんごのソースレベルでポータブルなライブラリが必要ひつよう場合ばあいC言語げんごでは共用きょうようたい、あるいは FORTRAN のEQUIVALENCEぶんPL/1 の OVERLAYぶんなどを使つかったトリックてきかたで、いずれも一般いっぱんろんとしてはあまりすすめられない手法しゅほうとされているものではあるが、実装じっそう可能かのう場合ばあいもある。

1つのけた乗算じょうざんにおいて、一時いちじ変数へんすう(radix - 1)2 + carry保持ほじできなければならず、carry最大さいだい(base - 1) である。IBM 1130 の場合ばあい、レジスタが32ビットなので、16ビットの演算えんざん途中とちゅう結果けっかが16ビットであらわせる範囲はんいえても処理しょり続行ぞっこうできる。高級こうきゅう言語げんごでは、おおきなかず配列はいれつかく要素ようそ(つまりけた)を16ビット符号ふごう整数せいすうとし、基数きすうを65536としたとき、けた乗算じょうざん結果けっかは 4,294,901,760 をえないが、32ビット符号ふごうあり整数せいすう上限じょうげん である。高級こうきゅう言語げんごによっては、たとえハードウェアが32ビット符号ふごう整数せいすう演算えんざんをサポートしていても、32ビット符号ふごう整数せいすう上限じょうげん)をデータがたとして使つかえない場合ばあいがある。また、32ビット符号ふごう整数せいすう使つかえる場合ばあいでも、64ビット符号ふごう整数せいすうではどうだろうか?

同様どうように、配列はいれつのインデックスよう変数へんすうも16ビットや32ビットという制限せいげんがある。64ビット整数せいすうをインデックス変数へんすう使つかえるとしても、今度こんどはメモリ容量ようりょう限界げんかいという問題もんだいがある。さらにおおきなかずあらわすには、適当てきとうおおきさのブロックにけ、インデックスとして(ブロック iけた j)のように2つの変数へんすう使つか方法ほうほうや、インデックス自体じたいおおきなかずとしてけたごとの配列はいれつあらわ方法ほうほうかんがえられる。いずれにしても記憶きおく装置そうち容量ようりょう限界げんかいけられない。観測かんそく可能かのう宇宙うちゅう存在そんざいするぜん原子げんしすうえないと予測よそくされている。

歴史れきし

[編集へんしゅう]

1959ねん発売はつばいされた IBM 1620任意にんい精度せいど演算えんざん実装じっそうした初期しょきれいである。1620 は可変かへんワードちょうじゅうしんコンピュータであり、メモリのゆるかぎ任意にんい桁数けたすう数値すうちについて計算けいさん可能かのうだった(浮動ふどう小数点しょうすうてん場合ばあい仮数かすう指数しすう桁数けたすうには制限せいげんがある)。メモリを最大さいだい搭載とうさいすると6まんけた数値すうち格納かくのうできるが、1620ようFORTRANコンパイラは桁数けたすうを10けた制限せいげんしていた。1620はトランジスタ使つかっていたが、加算かさんよう回路かいろたず、メモリじょうのテーブルを使つかって加算かさん実現じつげんしていた。

IBM はつのビジネスようコンピュータ IBM 702 は511けたまでの任意にんい精度せいど数値すうち演算えんざんをハードウェアで実装じっそうしていた。ソフトウェアでの初期しょき多倍たばいちょう整数せいすう実装じっそうとしては、Maclisp有名ゆうめいである。1980年代ねんだいになると、VAXオペレーティングシステム数字すうじ文字もじれつ数値すうちとして計算けいさんする関数かんすうぐん多倍たばいちょう整数せいすう機能きのうとして用意よういされるようになった。また、 IBM では REXX多倍たばいちょう整数せいすうをサポートしていた。

任意にんい精度せいど演算えんざんをサポートしているソフトウェア

[編集へんしゅう]

アプリケーション

[編集へんしゅう]
  • Mathematica などの数式すうしき処理しょりシステム任意にんい精度せいど演算えんざんをサポートしている。MathematicaGMP利用りよう
  • PARI/GP — オープンソースの計算けいさん代数だいすうソフトウェアで、任意にんい精度せいどをサポート。
  • bc - Unixけいシステムに標準ひょうじゅん搭載とうさいされている任意にんい精度せいど計算けいさんプログラム
  • Maxima数式すうしき処理しょりシステムCommon Lisp実装じっそうされていたため、多倍たばいちょう整数せいすういでいる。
  • Ultra Fractal — フラクタル生成せいせいプログラム
  • Fractint各種かくしゅフラクタル生成せいせい描画びょうができる FLOSS ソフトウェア
  • Virtual Calc 2000任意にんい精度せいど/基数きすう電卓でんたくWindowsよう
  • Calc — C言語げんごスタイルの任意にんい精度せいど電卓でんたく(LGPL2)
  • SpeedCrunch — オープンソースでクロスプラットフォームのこう精度せいど電卓でんたく
  • TTCalc — オープンソースの任意にんい精度せいど電卓でんたく(TTMathを使用しよう
  • Big Online Calculator浮動ふどう小数点しょうすうてんすう任意にんい精度せいど電卓でんたく。オンラインで利用りよう。(TTMath使用しよう
  • 多倍たばいちょう電卓でんたくLM — 「数式すうしき入力にゅうりょくがた多倍たばいちょう電卓でんたく初等しょとう関数かんすう任意にんい桁数けたすう計算けいさん可能かのう 分数ぶんすう計算けいさん可能かのう絶対ぜったいやく10^100000000までの数値すうちあつかえます。」とある。

ライブラリ

[編集へんしゅう]

任意にんい精度せいど演算えんざんおおくの場合ばあい専用せんようライブラリすことで実装じっそうされている。そのライブラリがデータがた定義ていぎし、数値すうち指定していした精度せいど格納かくのうしたり、計算けいさん実行じっこうするサブルーチンぐん提供ていきょうしている。

ライブラリによって数値すうち内部ないぶ表現ひょうげんことなる。整数せいすうのみをあつかうライブラリもあるし、各種かくしゅ基数きすうじゅうしんしんなど)で浮動ふどう小数点しょうすうてんすう格納かくのうするもある。分数ぶんすう有理数ゆうりすう形式けいしきかず格納かくのうするものもあれば、実数じっすうすべ表現ひょうげんできるとするものもある。


パッケージ/ライブラリめい 数値すうちがた 言語げんご ライセンス
apfloat じゅうしん浮動ふどう小数点しょうすうてん整数せいすう有理数ゆうりすう複素数ふくそすう JavaC++ LGPLおよびフリーウェア
ARPREC and MPFUN 整数せいすうしん浮動ふどう小数点しょうすうてんすう複素ふくそしん浮動ふどう小数点しょうすうてんすう C++、バインディングは C++FORTRAN BSD
Base One Number Class じゅうしん浮動ふどう小数点しょうすうてんすう C++ 有償ゆうしょう
bbnum library 整数せいすう浮動ふどう小数点しょうすうてんすう アセンブリ言語げんごC++ 改訂かいていBSD
phpseclib じゅうしん浮動ふどう小数点しょうすうてんすう PHP LGPL
BigDigits 自然しぜんすう C言語げんご フリーウェア[1]
Class Library for Numbers(CLN) 整数せいすう有理数ゆうりすう複素数ふくそすう C言語げんごC++ GPL
Computable Real Numbers 実数じっすう Common Lisp
IMSL C言語げんご 商用しょうよう
decNumber じゅう進数しんすう C言語げんご ICU licence(MIT Licence[2]
FMLIB 浮動ふどう小数点しょうすうてんすう FORTRAN
GNU Multi-Precision Library(および MPFR英語えいごばん 整数せいすう有理数ゆうりすう浮動ふどう小数点しょうすうてんすう C言語げんごC++[4] LGPL
GNU Multi-Precision Library for .NET 整数せいすう C#.NET LGPL
GNU Multi-Precision Library for Eiffel 整数せいすう実数じっすう Eiffel LGPL
HugeCalc 整数せいすう C++、アセンブリ言語げんご 有償ゆうしょう
IMath 整数せいすう有理数ゆうりすう C言語げんご フリーウェア
IntX 整数せいすう C#.NET 改訂かいていBSD
JScience LargeInteger 整数せいすう Java
LibTomMath 整数せいすう C言語げんごC++ パブリックドメイン
LiDIA 整数せいすう C言語げんごC++ 商用しょうよう利用りようについては無料むりょう
MAPM 整数せいすうじゅうしん浮動ふどう小数点しょうすうてんすう C言語げんご(バインディングは C++Lua フリーウェア
MIRACL 整数せいすう有理数ゆうりすう C言語げんごC++ 商用しょうよう利用りようについては無料むりょう
MPI 整数せいすう C言語げんご LGPL
MPArith 整数せいすう浮動ふどう小数点しょうすうてんすう有理数ゆうりすう Borland PascalDelphi zlib
mpmath 浮動ふどう小数点しょうすうてんすう複素ふくそ浮動ふどう小数点しょうすうてんすう Python 改訂かいていBSD
NTL 整数せいすう C言語げんごC++ GPL
OpenSSL 整数せいすう C言語げんご OpenSSL+SSLeay
TTMath library 整数せいすうしん浮動ふどう小数点しょうすうてんすう アセンブリ言語げんごC++ 改訂かいていBSD
vecLib.framework 整数せいすう C言語げんご プロプライエタリ
W3b.Sine じゅうしん浮動ふどう小数点しょうすうてんすう C#.NET 改訂かいていBSD
Boost.Multiprecision 整数せいすう浮動ふどう小数点しょうすうてん C++ Boost Software License

言語げんご

[編集へんしゅう]

みまたは標準ひょうじゅんライブラリの形式けいしき任意にんい精度せいど演算えんざんをサポートするプログラミング言語げんご以下いかげる。

  • Common Lisp多倍たばいちょう整数せいすう有理数ゆうりすう複素数ふくそすうをサポート
  • dc — POSIXの電卓でんたくユーティリティ
  • Erlangみの整数せいすうがた多倍たばいちょう整数せいすうとなっている。
  • Haskellみの整数せいすうがた多倍たばいちょう整数せいすうとなっている。
  • Javajava.math.BigInteger クラス(整数せいすう)、java.math.BigDecimal クラス(じゅうしん整数せいすう
  • .NETSystem.Numerics.BigInteger 構造こうぞうたい整数せいすう:4以降いこう
  • OCamlNumライブラリで多倍たばいちょう整数せいすう有理数ゆうりすうをサポート
  • Perl — bigintプラグマを指定していすることによりスコープ単位たんい多倍たばいちょう整数せいすう指定してい可能かのう。bignumプラグマにより多倍たばいちょう浮動ふどう小数点しょうすうてん指定してい。それぞれMath::BitInt, Math::BitFloatモジュールで実装じっそうされている。
  • Pythonみの intだい3.xばん)、longだい2.xばん)という整数せいすうがた多倍たばいちょう整数せいすう標準ひょうじゅんライブラリには Decimal クラスもあり、桁数けたすう指定してい可能かのう
  • REXXOpen Object RexxNetRexx同様どうよう
  • Rubyみの Bignum という整数せいすうがた多倍たばいちょう整数せいすう標準ひょうじゅんライブラリには BigDecimal クラスがあり、桁数けたすう指定してい可能かのう
  • Scheme任意にんい精度せいど整数せいすう有理数ゆうりすうをサポート(R5RS では推奨すいしょう、R6RS では必須ひっす
  • ScalaBigInt クラス.
  • SmalltalkSqueak などの各種かくしゅ処理しょりけいでサポート。
  • JavaScript ー bigint かた(プリミティブな符号ふごう整数せいすうがた)。通常つうじょう演算えんざん併用へいようすることで任意にんい精度せいど演算えんざんをサポートしている

脚注きゃくちゅう出典しゅってん

[編集へんしゅう]
  1. ^ えい: arbitrary-precision arithmetic
  2. ^ えい: bignum arithmetic
  3. ^ R.K. Pathria ちょA Statistical Study of the Randomness amongst the first 10,000 Digits of Pi、1962ねんMathematics of Computation だい16かん、N77-80、pp 188-97。 「77」という数字すうじならびが1000けたのブロックないに28かい出現しゅつげんすることについて「Such an extreme pattern is dangerous even if diluted by one of its neighbouring blocks」といている。
  4. ^ GMPY

参考さんこう文献ぶんけん

[編集へんしゅう]
  • Knuth, Donald, The Art of Computer Programming, ISBN 0-201-89684-2, Volume 2: Seminumerical Algorithms, Section 4.3.1: The Classical Algorithms
  • Implementing Multiple-Precision Arithmetic, Part 1
  • Nikolaevskaya et al. : "Programming with Multiple Precision", Springer-Verlag, ISBN 978-3-642-25672-1, e-ISBN 978-3-642-25673-8 (2012).
  • 幸谷こうたに智紀ともき : 多倍たばいちょう精度せいど数値すうち計算けいさん, 森北もりきた出版しゅっぱん, ISBN 978-4-627-85491-8 (2019ねん11月)。
  • Fürer, M. : "Faster Integer Multiplication", SIAM J. Comput., Volume 39 Issue 3, 2009, pages 979–1005.
  • Harvey, D. and van der Hoeven, J. : "Integer Multiplication in Time O(nlogn)".
  • Karatsuba, A. : "The Complexity of Computations", Proceedings of the Steklov Institute of Mathematics, Volume 211, 1995, pages 169–183.
  • Schönhage, A. and Strassen, V. : "Schnelle Multiplikation grosser Zahlen", Computing, Volume 7, Issue 3–4, September 1971, pages 281–292.
  • Erica Klarreich : "Multiplication Hits the Speed Limit", Communications of the ACM, January 2020, Vol. 63 No. 1, Pages 11-13. doi=10.1145/3371387.

関連かんれん項目こうもく

[編集へんしゅう]