================================== 巨大数値クラス[ FloatedBigDigit ] 仕様説明書 by K-ARAI (2021) 初版:2021.02.13 改訂:2022.01.13 ================================== 0.免責: このプロジェクトは実験的なものであり その性能や精度、安定性や保守に 責任を負うものではありません。 使用により損害が生じた場合も その賠償責任は負わないものとします。 1.概要 1-1.これは何? 浮動小数点の巨大な数値クラスです。 (固定小数点の数値クラスより派生) 設定により巨大な桁数を扱って計算ができます。 1-2.数値の仕様 数値は5桁区切りの10進数で保持し、 指定桁数の整数部に指数がついています。 このクラスの数値は4つの状態があります。 シード:-99999から99999までの整数が入っている。初期化はこの状態で。 少数:シードに指定桁の小数部と指数がついている。 巨数:シードを超える大きな数値が入っている(小数部も付く)。 不可:オーバーフロー状態:計算は続行出来ません。 1-3.計算の仕様 指定の有効桁を維持し、浮動小数点演算を行います。 一部関数は時間制約のため、途中で計算を打ち切る 場合があります。(中途の結果をエラー判定で返します) 1-4.関数仕様 呼び出せるメンバ関数はnumberを渡す場合とこのクラスを渡す場合があります。 前者は小文字、後者は大文字で始まる命名規則です。 間違った引数を渡した場合はコンソールログにメッセージ出力があります。 返り値は floatedBigDigitOK または floatedBigDigitERR で、 桁落ちがあった場合にもエラーとしています。 2.準備 2-1.桁数設定:計算を行う桁数を一番最初に一度だけ設定します。 SetFloatedBigDigitKeta(n); // これはクラス外の設定関数です。 2-2.数値クラスの準備:javascriptのオブジェクトなのでこうです。 var M = new FloatedBigDigit(); 3.初期化 M.clear(); // ゼロクリア M.Set(string); // 文字列を読み取り初期化 4.演算 4-1.number演算:javascriptのnumberを渡して演算ができます。 通常は-99999から99999を渡してください。クラスはシードになります。   演算結果により少数または巨数に状態が変化します。 M.set(n); M.add(n); M.sub(n); M.mul(n); M.div(n); M.divR(n,f); 4-2.クラス演算:数値クラス同士の基本演算です。 M.Copy(V); M.Add(V); M.Sub(V); M.Mul(V); M.Div(V); M.DivR(V,f); 4-3.状態取得: M.isZero(); // ゼロ? M.isSeed(); // シード? M.isSmall(); // 小数部付き? M.isBig(); // 巨大? M.isExp(); // 指数表現? M.isOver(); // オーバーフロー? M.isMinus(); // マイナス? M.isEmpty(); // 全くのゼロ?(余剰精度検査:後述) M.size(); // 設定されているブロック数:1ブロックには00000から99999が入っている。 M.digit(idx); // idxで指定するブロックの数値を返す。 M.order(); // 指数部を返す。 M.zero_pos(); // 指数が示すブロックの位置を返す。 M.value(idx); // 上記位置をゼロとして指定ブロックの数値を返す。 M.valid_size(); // 有効ブロック数を返す。(以降のブロックはゼロ!) M.toString(); // 数値を文字列に変換(読みやすく区切ります):alert(M.toString());で即席デバッグ。 M.toString2(); // 数値を文字列に変換(区切りなし):外部の処理に渡したいときに。 M.toValue(); // 数値を通常型に変換(桁落ち):外部の処理に渡したいときに。 M.footString(); // 余剰精度を文字列に変換(見たいですか?デバッグ用) M.unitStr(idx); // 指定ブロックを "0" 詰めの文字列で返す。 M.unitSpStr(idx); // 指定ブロックを"空白" 詰めの文字列で返す。 4-4.基本関数 M.Fix(); // 整数部 M.Round(); // 四捨五入 M.Int(); // 最大整数 M.Abs(); // 絶対値 M.Sig(); // 符号反転 M.FD(); // 余剰精度削除 M.FR(); // 余剰精度丸め 4-5.比較関数 M.compare(n); M.Compare(V); 返り値:Mがより大きい +1 / Mがより小さい -1 / 数値は同じ 0 比較するクラスの状態が異なっても大丈夫です。 ※余剰精度込みなので注意! 4-6.組み込み関数 M.SetPI(); // 円周率πを設定する。 M.SetE(); // e (まあ、あれだ!)を設定する。 M.SetFull(); // 指数なし最大値を設定する。 M.SetRnd(); // 0から1未満の乱数を設定する。 M.dice(n); // サイコロを振る! M.dice(k,n); // (架空)正n面体をk個(省略時1個) M.Dice(N); // サイコロを振る! M.Dice(K,N); // 引数は変換されます。 M.mod(n); // 剰余演算 M.Mod(V); // 符号は除数に一致! M.setSequence(n,k); // 順列 nPk を設定する。 M.SetSequence(N,K); // 引数は変換されます。 M.setCombination(n,k); // 組合わせ nCk を設定する。 M.SetCombination(N,K); // 引数は変換されます。 M.power(n); // Mのn乗 (nは整数) M.Power(V); // MのV乗 M.PowerDiv(V); // MのVによる根(Vは正の整数) M.setFactorial(n); // n! (nは正の整数) M.SetFactorial(V); // V! (Vは正の整数) M.setDoubleFactorial(n); // n!! (nは正の整数) M.SetDoubleFactorial(V); // V!! (Vは正の整数) M.SetExp(V); // eのV乗 M.SetLn(V); // eによる対数 M.SetLog(V); // 10による対数 M.SetLog2(V); // 2による対数 M.SetSin(V); // 三角関数:Vはラジアンで! M.SetCos(V); M.SetTan(V); M.SetAsin(V); // 逆三角関数:結果はラジアンで! M.SetAcos(V); M.SetAtan(V); M.SetAtan2(X,Y); (やっぱatan2は良いよね!) M.SetSinh(V); // 双曲線関数 M.SetCosh(V); M.SetTanh(V); M.SetAsinh(V); // 逆双曲線関数 M.SetAcosh(V); M.SetAtanh(V); ※PIとEは計算結果をキャッシュして使っています。   ※ほか、三角関数などについては級数展開で指定精度まで計算しています。 ※どうしても誤差が残る場合がありますので検算はお忘れなく!    (ソースコードはちょっとしたカンペに!?) 4-7.余剰精度って? 指定精度の計算を行う場合には、さらに余分な精度が必要な場合があります。   このクラスは10桁ぶん持っています。表示はされませんが次の計算に持ち越されます。   求める答えにより、丸めるか丸めないかを判断してください。 例:0.12345678955 を丸めて 0.123456790 これは求める答えか? 5.コンタクト 作者は事情により暇をしている元SEの個人プログラマです。 使ってみたとかの連絡は大歓迎でお待ちしております。 http://www13.plala.or.jp/beni/basic/ 6.使用許諾 同梱のプロジェクト BASIC OF THE CANVAS に準じるものとします。 ( requests.txt 参照 ) ================================================ 「固定小数点巨大数値」クラスプロジェクトは発展解消、 「浮動小数点巨大数値」クラスとしてリスタートします。 ※実はコードもかなりスマートに?(自己比較) 引き続きデバッグとリファインを続けます。 2021.02.13-03.04 記す K-ARAI ================================================ 履歴: 2021.05.08 剰余演算追加 2021.05.10 BugFix ( 巨大割り算 / ダイス / 双曲線関数 ) 2021.05.11 改良(三角関数・巨大入力) 2021.05.18 改良(文字列による初期化を追加) 2021.05.20 改良(関数追加・精度向上) 2022.01.13 改良