1. トップページ
  2. 松下響の天輪返し

松下響の天輪返し

多倍長浮動小数演算ライブラリ SLiMPNC4J

夜も更けて参りました。こんばんは、松下です。本日は続けて拙作の多倍長浮動小数演算ライブラリ、SLiMPNC(スリムピンク)4J = the Simple Library of Multiple-Precision Number Calculation for Javascript を紹介します。
まず多倍長演算ライブラリとは何かと申しますと、通常JavaScriptで使用できる数字はせいぜい15桁(=252)なのですが、これを何とかして何桁でも計算できるようにするライブラリのことです。「何とかして」というのは具体的にどうするのかと言いますと、SLiMPNC(スリムピンク)4Jでは計算を筆算アルゴリズムまで分解して1桁ずつ処理しています。
JavaScriptの仕様上の限界である15桁と言えば100兆くらいですので、通常は全く問題が無いのですが、確率計算を行う場合には0.999999999999999999992230000などといった計算になることがあり、これを15桁で切ってしまうと130000となるので計算の意味がありません。つまりCTraPS(シートラップス)を作るための下準備としてこれを作ったわけです。
多倍長演算は日常的には必要が無いとは言えいくらかの需要があるはずで、実際に検索してみると色々とライブラリが出てくるわけです。しかしどのライブラリの説明を見てもとっつきづらく、使い方もダウンロード先も良く分からないので結局自分で作ってみることになりました。
つまり、このSLiMPNC(スリムピンク)4Jは機能が単純で分かりやすいライブラリというコンセプトで作っています。逆に言えば機能が充実しているとは言えず、四則演算と累乗(指数が整数の場合のみ)までしか対応していません。計算速度もそれほど考慮しておりませんので、速度面では他と比べるだけ無駄だと思います。

ところで実はPHPなら標準でその多倍長演算機能がついているのですが、PHPはサーバーサイドスクリプトですので、入力された数によってはサーバー負荷が恐ろしいことになります。そのため、今回は実用上の安全性を考慮してユーザー側のPC上で計算を行うJavaScriptのライブラリを用意しました。累乗の基数と指数の設定によっては過負荷でブラウザがフリーズすることがありますが、予めご容赦ください。

なお、JavaScriptやアルゴリズムの勉強を碌にせずに必要なところだけ調べながら作ってますので、構造や文法が拙いのはそのあたりが原因です。

サンプルスクリプト

計算精度 浮動小数何桁の精度で計算するかを設定します。
計算負荷を考慮すると、多くて100桁程度でとどめるのが無難です。
表示有効桁数 結果表示を有効数字何桁で表示するかを設定します。
最終表示桁数 計算結果に表示する数字の桁(※小数点含む文字数)の限界を設定します。
この桁を超えた場合にはm×10n形式で表示します。

ダウンロード

使い方

MPadd(parameter0:String, parameter1:String, essentialfigure:int or '')

多倍長加算関数です。
parameter0 + parameter1の結果をString形式で返します。
parameter0及びparameter1はString形式で入力する必要があります。
essentialfigureで有効数字の桁数を指定できます。指定が無い場合は全桁を返します。

使用例 : answer = MPadd('9999999999999999.9', '888888888888888.888888');

MPsub(parameter0:String, parameter1:String, essentialfigure:int or '')

多倍長減算関数です。
parameter0 – parameter1の結果をString形式で返します。
parameter0及びparameter1はString形式で入力する必要があります。
essentialfigureで有効数字の桁数を指定できます。指定が無い場合は全桁を返します。

使用例 : answer = MPsub('9999999999999999.9', '888888888888888.888888');

MPmul(parameter0:String, parameter1:String, essentialfigure:int or '')

多倍長乗算関数です。
parameter0 x parameter1の結果をString形式で返します。
parameter0及びparameter1はString形式で入力する必要があります。
essentialfigureで有効数字の桁数を指定できます。指定が無い場合は全桁を返します。

使用例 : answer = MPmul('9999999999999999.9', '888888888888888.888888', 30);

MPdiv(parameter0:String, parameter1:String, essentialfigure:int or '')

多倍長除算関数です。
parameter0 x parameter1の結果をString形式で返します。
parameter0及びparameter1はString形式で入力する必要があります。
essentialfigureで有効数字の桁数を指定できます。指定が無い場合は15桁で丸めて返します。

使用例 : answer = MPdiv('9999999999999999.9', '888888888888888.888888', 30);

MPpow(parameter:String, power:String, essentialfigure:int or '')

多倍長累乗関数です。
parameterpowerの結果をString形式で返します。
parameter及びpowerはString形式で入力する必要があります。
指数は整数にしか対応していませんので、小数で入力しても自動的に切り捨てます。
parameter100=(parameter10)10などと自動的に分解して計算するため、parameterの桁が少ない場合はある程度高速に動きますが、parameterが数万桁に及ぶ場合はその桁の処理が膨大なため過負荷に陥るという難点があります。保持データを現状の全桁文字列から浮動小数点オブジェクトに改めることで改善できそうですが、全部の関数を書き直す必要があるため今のところ対応していません。
essentialfigureで有効数字の桁数を指定できます。指定が無い場合は15桁で丸めて返します。

使用例 : answer = MPpow('0.999999999999999999999999', '300000', 30);

MPesrnd(parameter:String, essentialfigure:int)

多倍長有効数字丸め関数です。
parameterを有効数字essentialfigure桁で丸めてString形式で返します。丸め演算は四捨五入です。
丸め専用の関数なのでessentialfigureの入力は必須です。

使用例 : answer = MPpow('0.999999999999999999999999', '300000', 30);

MPabscomp_simple(parameter0:String, parameter1:String)

多倍長正整数文字列の絶対値を比較する関数です。
parameter0とparameter1を比較して、paramter0が大きければ0を、parameter1が大きければ1をint形式で返します。
多倍長除算の補助関数ですので、計算負荷を軽減するため小数や負の数には対応していません。

使用例 : answer = MPabscomp_simple('32248', '32837');

getInt(searchid:String)

HTMLページのDOMツリーからint形式で内容を取得する関数です。
id=searchidとなる要素のvalueの内容を取得します。inputタグなどから取得するのを想定しています。
返り値がint形式のため、15桁を超える数には対応できません

使用例 : parameter[0] = getInt('form_input0');

getIntString(searchid:String)

HTMLページのDOMツリーからString形式で内容を取得する関数です。
id=searchidとなる要素のvalueの内容を取得します。inputタグなどから取得するのを想定しています。
String形式のため、取得できる桁数の制限はありません。
返り値がStringの内容が小数である場合、自動的に小数点以下を削って整数化します。

使用例 : parameter[0] = getIntString('form_input0');

getFloat(searchid:String)

HTMLページのDOMツリーからfloat形式で内容を取得する関数です。
id=searchidとなる要素のvalueの内容を取得します。inputタグなどから取得するのを想定しています。
返り値がfloat形式のため、15桁を超える数には対応できません

使用例 : parameter[0] = getFloat('form_input0');

getFloatString(searchid:String)

HTMLページのDOMツリーからString形式で内容を取得する関数です。
id=searchidとなる要素のvalueの内容を取得します。inputタグなどから取得するのを想定しています。
返り値がString形式のため、取得できる桁数の制限はありません。

使用例 : parameter[0] = getFloatString('form_input0');

correctNumberString(text:String)

textの中身を数字として整理整頓する関数です。
数字、負号、小数点以外全ての文字を削除し、半角に統一します。また、小数の末尾についた0を削除します。
返り値はString形式になります。
主にユーザーが入力しうる全角・半角混じりの文字列を正規化するために使用します。ユーザー入力変数を演算関数に入れる前に一旦この関数に突っ込んで整理しておくと比較的安全に動作します。上記getInt~getFloatStringは全て自動的にcorrectNumberStringを実行するため、再度この関数を実行する必要はありません。
先頭以外の負号や2つ目以降の小数点といったイレギュラーには未対応です。

使用例 : parameter = correctNumberString('-389.2658024846425000');

MPparseint(parameter:String)

String型数字parameterを整数化する関数です。
単純に小数点以下を切り捨てて整数化したものをString型で返します。

使用例 : parameter = MPparseint('-344.73');

MPshortstyle(parameter:String, essentialfigure:int or '', xstyle:String or '', powstyle_start:String or '', powstyle_end:String or '')

String型数字parameterをm×10nスタイルに成型する関数です。
初期値ではm×10<sup>n</sup>になりますが、'×'をxstyle、'<sup>'をpowstyle_start、'</sup>'をpowstyle_endで置き換えることが出来ます。
返り値はString形式になります。
essentialfigureで有効桁数を指定できます。指定しない場合は15桁で丸められます。

使用例 : parameter = MPshortstyle('-0.0000007776338002739722');

fit_digit(parameter:String, displaydigit:int, digitlimit:int)

String型数字parameterを桁数に応じてm×10nスタイルに成型する関数です。
有効桁数をdisplaydigit、有効桁前後の0や小数点を合わせた文字数の限界をdisplaydigitで指定します。
処理としては最初にdisplaydigitの桁数で丸め、その結果String型数字の文字数がdigitlimitを超える場合にm×10nスタイルに成型します。
要するにページ上の限られたスペースに収まるように数字を成型します。

使用例 : result = fit_digit('34588370000000000000000000000000000');

カテゴリー: web制作 | タグ: , | 4件のコメント

多倍長浮動小数演算ライブラリ SLiMPNC4J への4件のコメント

  1. ピンバック: トレパク疑惑確度計算ツール CTraPS | 松下響の天輪返し

  2. ピンバック: 無断転載等の著作物無断複製利用問題FAQ | 松下響の天輪返し

  3. 袁 丹 より:

    slimpnc.jsの518行目についてですが、480行目で「除数の小数桁数分だけドットの桁数を上げる」というところで
    たとえば「0 ÷ 12.1」の場合、
    被除数の「0」は「00」に調整されて、「0の例外処理」が想定通りにならなくなると思います。

    • 松下 響 より:

      仰る通り、0を小数で割った場合に計算結果が不正になっていましたので「除数の小数桁数分だけドットの桁数を上げる」処理の順番を0判定よりあとに変更して対処しました。
      ご指摘いただきありがとうございます。

      なお、一通り作った後で、内部処理を全体的に浮動小数に変更すれば桁のループ処理が減って大幅に高速化できると気づいたのですが、現在のところ全部書き直す気力が無いのでご容赦くださいませ。

コメントを残す

メールアドレスが公開されることはありません。

*

最近の投稿

松下 on twitter

サイト更新履歴

情報を取得するにはjavascriptを有効にしてください。