浮動小数点数の演算による誤差を防ぎ、正確な計算を行います。
- 構文
- 引数
- 戻り値
プログラム
Decimalモジュールとは
Decimalモジュール (自作関数)は精度の高い計算を行う必要があるときに使用します。JavaScriptで高精度な数値計算を行うdecimal.jsというライブラリをUWSCでも利用できるように作成したものです。
decimal.jsのダウンロードはGitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript · GitHub、公式ドキュメントはdecimal.js APIで確認できます。
UWSCの倍精度浮動小数点型(Double型)は15桁程度の精度がありますが、すべての実数を表現できるわけではないため期待値と異なる値になる場合もあります。
正しい計算結果を得られない原因については#errorの項目で記述しています。
Decimalインスタンス
Decimalインスタンスとは、浮動小数点数を厳密に表現するためのオブジェクトです。Decimalモジュール (自作関数)ではオブジェクトとして扱うことはできないので配列で数値を管理します。
Decimalモジュールの#ConstructorでDecimalインスタンスを生成することができます。
配列の0番目に符号、1番目に指数、2番目以降に指定桁ごと(デフォルト:7桁)に分割した仮数部が格納されます。
以下は#ConstructorでDecimalインスタンスを生成するプログラムです。戻り値は配列なのでJOIN関数でカンマで区切った文字列として出力します。
出力される結果の形式は符号,指数部,仮数部1,仮数部2,…です。仮数部は小数点の位置を中心として指定桁(7桁)ごとに区切られます。
- 結果
#Constructorで生成した符号、指数、仮数部で構成される#decimal-instanceを文字列に戻すには#finiteToStringを使います。
誤差
丸め誤差
丸め誤差とは、数値を有限の桁数で表すためにある桁以降を切り捨て、切り上げ、四捨五入することで生じる誤差。
例えば無限に続く円周率3.141592…を小数点以下3桁目を四捨五入して3.14として扱うことは、1592…が切り捨てられ丸め誤差となります。
打切り誤差
打切り誤差とは、本来無限に続く計算を途中で打ち切ることによって生じる誤差。
以下は1/3を計算した結果です。無限小数ですが、小数点以下16桁目以降は切り捨てられています。
- 結果
以下は2/3を計算した結果です。1/3の時と同様に無限小数ですが、小数点以下16桁目を四捨五入することで切り上げられています。
- 結果
#dividedByを使うと有効桁数を指定することができます。以下は1/3を有効桁数50桁に指定。
- 結果
以下は2/3を有効桁数20桁、#rmを1(0の方向へ丸める)を指定。
- 結果
情報落ち
情報落ちとは、絶対値の大きい数と小さい数を加減算したとき、小さい数の情報が結果に反映されずに生じる誤差。
10000000000000000 + 1 - 10000000000000000を計算する例です。\(10^{16}\)という大きい数に対して1という小さい数を加算しても結果に反映されず誤差が生じます。
- 結果
- 結果
桁落ち
桁落ちとは、ほぼ等しい数を減算したときに生じる誤差。例えば0.123456789 - 0.123456788の計算を行ったとき0.123456789、0.123456788は有効桁数9桁だが、計算結果の0.000000001は有効桁数1桁というように有効桁数が極端に減少することをいいます。
以下のプログラムは桁落ち以前に小数値であるために丸め誤差が発生しているため、結果が正しく出力されません。
- 結果
Decimalモジュール (自作関数)を使うと正しい結果を得られます。
- 結果
オーバーフロー/アンダーフロー
オーバーフローは、データ型で扱える範囲の上限値を超えたときに発生します。Decimalモジュール (自作関数)ではデフォルトで9E+15まで扱うことができます。
一方でアンダーフローは、データ型で扱える範囲の下限値を下回ったときに発生します。Decimalモジュール (自作関数)ではデフォルトで-9E+15まで扱うことができます。
特殊値
Decimalモジュール (自作関数)では通常の値とは別に以下の特殊値があります。decimal.jsで無限大を表す値はInfinityですが、UWSCでは同じ無限大を表す値としてINFがあるのでそれを文字列形式の"INF"として扱うこととします。
| 特殊値 | 意味 | |
|---|---|---|
| decimal.js | UWSC | |
| Infinity | INF | 正の無限大 |
| -Infinity | -INF | 負の無限大 |
| NaN | NaN | 非数 |
decimal.jsで値は符号、指数、仮数部の配列で構成で表現されますが、特殊値は普通の値では表現できないため配列構成も特殊です。
数値を配列に変換するには#Constructorを使います。
まずはdecimal.jsでの特殊値の配列構成です。Decimal{ }内が配列の値で、カンマ区切りで0〜2番目の値で特殊値を表します。
次にUWSCでの特殊値の配列構成です。decimal.jsではNaNやnullで表していた値をUWSCではNULLやFALSEとして扱っています。UWSCでNaNに該当する値がないのと、特殊値を判断する分岐処理での都合によるためです。
また特殊値を含む値の四則演算の結果は以下の表のようになります。
1行目は被演算数INF、演算数INFのときの結果が、加算はINF、減算はNaN、乗算はINF、除算はNaNということを表しています。
| 式 | 結果 | ||||
|---|---|---|---|---|---|
| 被演算数 | 演算数 | 加算 | 減算 | 乗算 | 除算 |
| INF | INF | INF | NaN | INF | NaN |
| INF | -INF | NaN | INF | -INF | NaN |
| INF | NaN | NaN | NaN | NaN | NaN |
| INF | 0 | INF | INF | NaN | INF |
| -INF | INF | NaN | -INF | -INF | NaN |
| -INF | -INF | -INF | NaN | INF | NaN |
| -INF | NaN | NaN | NaN | NaN | NaN |
| -INF | 0 | -INF | -INF | NaN | -INF |
| NaN | INF | NaN | NaN | NaN | NaN |
| NaN | -INF | NaN | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN |
| NaN | 0 | NaN | NaN | NaN | NaN |
| 0 | INF | INF | -INF | NaN | 0 |
| 0 | -INF | -INF | INF | NaN | 0 |
| 0 | NaN | NaN | NaN | NaN | NaN |
| 0 | 0 | 0 | 0 | 0 | NaN |
以下の表は被演算数、演算数でまとめたもので内容は上の表と同じです。
| 被演算数 | 演算数 | |||
|---|---|---|---|---|
| INF | -INF | NaN | 0 | |
| INF | +:INF -:NaN *:INF /:NaN |
+:NaN -:INF *:-INF /:NaN |
+:NaN -:NaN *:NaN /:NaN |
+:INF -:INF *:NaN /:INF |
| -INF | +:NaN -:-INF *:-INF /:NaN |
+:-INF -:NaN *:INF /:NaN |
+:NaN -:NaN *:NaN /:NaN |
+:-INF -:-INF *:NaN /:-INF |
| NaN | +:NaN -:NaN *:NaN /:NaN |
+:NaN -:NaN *:NaN /:NaN |
+:NaN -:NaN *:NaN /:NaN |
+:NaN -:NaN *:NaN /:NaN |
| 0 | +:INF -:-INF *:NaN /:0 |
+:-INF -:INF *:NaN /:0 |
+:NaN -:NaN *:NaN /:NaN |
+:0 -:0 *:0 /:NaN |
プロパティ
演算精度や丸め方法、指数範囲などを制御します。
| 変数 | 説明 | 既定値 |
|---|---|---|
| precision | 有効桁数 | 20 |
| rounding | #rm | 4 |
| modulo | 剰余の定義を指定 | 1 |
| toExpNeg | 指数表記を使い始める負の指数の閾値 | -7 |
| toExpPos | 指数表記を使い始める正の指数の閾値 | 21 |
| minE | 許容する最小指数。指数がこの数値以下になると0を返します。 | -9E+15 |
| maxE | 許容する最大指数。指数がこの数値以上になるとINFを返します。 | 9E+15 |
プロパティ値は以下のように指定することで変更できます。
precision
有効桁数を指定します。演算結果がこの桁数に丸められます。デフォルトでは有効桁数20桁。
このプロパティはライブラリ全体の既定の有効桁数を設定するグローバル設定です。インスタンスやメソッド呼び出しで明示的に有効桁数を渡さない場合に使われます。
rounding
丸めモードを指定します。値は#rmの表にあるように0から8の値を指定できます。デフォルトでは四捨五入(4)。
このプロパティはライブラリ全体の既定の丸めモードを設定するグローバル設定です。インスタンスやメソッド呼び出しで明示的に丸めモードを渡さない場合に使われます。
modulo
剰余を求める際のモードを設定します。
| プロパティ | 値 | 説明 |
|---|---|---|
| ROUND_UP | 0 | 無限大方向へ丸める |
| ROUND_DOWN | 1 | 0の方向へ丸める |
| ROUND_FLOOR | 3 | 負の無限大方向へ丸める |
| ROUND_HALF_EVEN | 6 | 偶数丸め |
| EUCLID | 9 | 剰余は常に正数 |
以下の式は各モードでの基本形式です。
\[ q = \operatorname{round\_mode}\!\left(\frac{a}{n}\right),\qquad r = a - n\cdot q \]被除数を\(a\)、除数を\(n\)、商を\(q\)、剰余を\(r\)とする。ただし\(n \ne 0\)。\(\vert x \vert\)は絶対値、\(\lceil x \rceil\)は天井関数、\(\lfloor x \rfloor\)は床関数、sgn(x)は符号関数(\(x > 0 \to 1\)、\(x = 0 \to 0\)、\(x < 0 \to -1\))を表します。
指定したモードでの商を求めるには#quotient、剰余を求めるには#moduloを使います。
ROUND_UP
商を切り上げで丸めます。被除数が負なら剰余は正、被除数が正なら剰余は負となります。
丸め関数(無限大方向へ丸める)
\[ \operatorname{round\_up}(y) = \begin{cases} \lceil y\rceil & (y>0)\\ \lfloor y\rfloor & (y<0)\\ 0 & (y=0) \end{cases} \]商と剰余
\[ q=\operatorname{round\_up}\!\left(\frac{a}{n}\right),\qquad r=a-nq \]\(a\)を-5、\(n\)を3としたときの商と剰余を求めます。
\[ q=\operatorname{round\_up}\!\left(\frac{-5}{3}\right)=\lfloor -1.6\rfloor=-2 \] \[ \qquad r=a-nq=-5-3\times(-2)=-5+6=1 \]以下はプロパティにROUND_UPを指定したときの剰余を求めるプログラムです。
- 結果
ROUND_DOWN
丸め関数(0の方向へ丸める)
\[ \operatorname{trunc}(y)=\begin{cases} \lfloor y\rfloor & (y\ge0)\\[4pt] \lceil y\rceil & (y<0) \end{cases} \]商と剰余
\[ q=\operatorname{trunc}\!\left(\frac{a}{n}\right),\qquad r=a-nq \]\(a\)を-5、\(n\)を3としたときの商と剰余を求めます。
\[ q=\operatorname{round\_up}\!\left(\frac{-5}{3}\right)=\lceil -1.6\rceil=-1 \] \[ \qquad r=a-nq=-5-3\times(-1)=-5+3=-2 \]以下はプロパティにROUND_DOWNを指定したときの剰余を求めるプログラムです。
- 結果
ROUND_FLOOR
丸め関数(負の無限大方向へ丸める)
\[ \operatorname{floor}(y)=\lfloor y\rfloor \]商と剰余
\[ q=\lfloor\tfrac{a}{n}\rfloor,\qquad r=a-nq \]\(a\)を-5、\(n\)を3としたときの商と剰余を求めます。
\[ q=\lfloor\tfrac{-5}{3}\rfloor=\lfloor-1.6\rfloor=-2 \] \[ \qquad r=a-nq=-5-3\times(-2)=-5+6=1 \]以下はプロパティにROUND_FLOORを指定したときの剰余を求めるプログラムです。
- 結果
ROUND_HALF_EVEN
補助量
\[ m=\lfloor y\rfloor,\qquad d=y-m\quad(0\le d<1) \]丸め関数(最近接、端点は偶数に丸める)
\[ \operatorname{round\_half\_even}(y)= \begin{cases} m & (d<0.5),\\[6pt] m+1 & (d>0.5),\\[6pt] m & (d=0.5\ \text{かつ}\ m\ \text{が偶数}),\\[6pt] m+1 & (d=0.5\ \text{かつ}\ m\ \text{が奇数}). \end{cases} \]商と剰余
\[ q = \operatorname{round\_half\_even}\!\left(\frac{a}{n}\right),r=a-nq \]\(a\)を-5、\(n\)を3としたときの商と剰余を求めます。
\[ q = \operatorname{round\_half\_even}\!\left(\frac{-5}{3}\right)=\lfloor -1.6\rfloor=-2 \] \[ r=a-nq=-5-3\times(-2)=-5+6=1 \]以下はプロパティにROUND_HALF_EVENを指定したときの剰余を求めるプログラムです。
- 結果
EUCLID
商
\[ q = \operatorname{sgn}(n)\cdot\left\lfloor\frac{a}{|n|}\right\rfloor \]これにより剰余は必ず非負となる(0 ≤ r < |n|)。
剰余
\[ r = a - n\cdot\Big(\operatorname{sgn}(n)\cdot\left\lfloor\frac{a}{|n|}\right\rfloor\Big) \] \[ r \equiv a \pmod{|n|},\qquad 0\le r<|n| \]\(a\)を-5、\(n\)を3としたときの商と剰余を求めます。
\[ q = \operatorname{sgn}(3)\cdot\left\lfloor\frac{-5}{|3|}\right\rfloor = 1\cdot\left\lfloor-1.6\right\rfloor=-2 \] \[ r = -5-3\cdot\Big(\operatorname{sgn}(3)\cdot\left\lfloor\frac{-5}{|3|}\right\rfloor\Big)=-5-3\cdot\Big(1\cdot\left\lfloor-1.6\right\rfloor\Big)=-5-3\cdot\Big(1\cdot(-2)\Big)=-5-3\cdot-2=-5+6=1 \]以下はプロパティにEUCLIDを指定したときの剰余を求めるプログラムです。
- 結果
toExpNeg
負数で指数を使い始める値を指定します。
負数では指数を使い始める値(toExpNeg)は-7乗がデフォルトになっているため指数の値がそれ以下のときは指数表記となります。-6乗までは固定小数点で出力されます。
- 結果
以下は\(2^{-20}\)を求めるプログラムです。デフォルトでは-7乗で指数表記となります。
- 結果
toExpNegに負数を指定することで指数を使い始める値を指定できます。以下は負の指数の閾値を-10としています。
- 結果
toExpPos
正数で指数を使い始める値を指定します。
正数では指数を使い始める値(toExpPos)は21乗がデフォルトになっているため指数の値がそれ以上のときは指数表記となります。20乗までは固定小数点で出力されます。
- 結果
以下は\(2^{100}\)を求めるプログラムです。デフォルトでは有効桁数(precision)が20桁、正数では指数を使い始めるの値(toExpPos)が21乗なので以下のように丸められてしまいます。
- 結果
関数を実行する前にプロパティに値を指定することで結果の精度を変更できます。
以下は有効桁数を35桁、指数を使い始める値を50乗としています。大きい値を指定することで結果を丸めずに求めることができます。
- 結果
minE
許容する指数の下限値を指定します。これを下回る値はアンダフローとして扱われ0を返します。
以下は0.01、0.001を指数表記にするプログラムです。
- 結果
eの右側の数値が指数を表しています。
以下は指数が-3以下のときはアンダーフローとし0を返します。0.01は指数表記だと1e-2なので0.01を返しますが、0.001は指数表記だと1e-3となりminEで指定された-3以下となるので0を返します。
- 結果
maxE
許容する指数の上限値を指定します。これを上回る値はオーバーフローとして扱われINFを返します。
以下は10000000、100000000を指数表記にするプログラムです。
- 結果
minEのときと同様、eの右側の数値が指数を表しています。
以下は指数が8以上のときはオーバーフローとしてINFを返します。10000000は指数表記だと1e+7なので10000000を返しますが、100000000は指数表記だと1e+8となりmaxEで指定された8以上となるのでINFを返します。
- 結果
引数
精度(Precision)
演算結果の精度を表します。この設定値を超える桁数が必要になった場合、#rmのルールに従って丸められます。デフォルトは20桁です。
特定の関数の呼び出しごとに適用するローカルな有効桁数のオーバーライドです。該当呼び出しだけに適用され、他の操作や既定値は変わりません。
演算時に一時的に計算精度を制御したいときに使います。
以下は引数にprを持つ関数です。
- #dividedBy
- #div
- #minus
- #sub
- #plus
- #add
- #times
- #mul
- #divide
- #getLN10
- #intPow
- #calculate
- #calcRPN
- #toRPN
以下は除算の結果を指定した桁数で丸めるプログラムです。
- 結果
精度が整数の桁数よりも小さい場合、先頭からprで指定された桁以降は0になります。丸めモードはデフォルトでは四捨五入(4)が指定されています。
- 結果
有効桁数(significant digits)
演算後の最終的な丸め・フォーマットを行うときに使います。
以下は引数にsdを持つ関数です。
- #toBinary
- #toHexadecimal
- #toOctal
- #toPrecision
- #toSignificantDigits
- #finalise
- #finiteToString
- #getLN10
- #getPI
- #naturalExponential
- #naturalLogarithm
- #toStringBinary
丸めモード(Rounding Mode)
演算結果を有効桁数に合わせる際の丸め方を表す整数を指定します。デフォルトは4の四捨五入です。
特定の丸め操作を行うメソッド呼び出しごとに使うローカルな丸めモードのオーバーライドです。該当呼び出しだけに適用され、他の操作や既定値は変わりません。
定数名はUWSCでは定義していないので0〜8の値を直接指定してください。
| 値 | 定数名 | 説明 |
|---|---|---|
| 0 | ROUND_UP | 無限大方向へ丸める |
| 1 | ROUND_DOWN | 0の方向へ丸める |
| 2 | ROUND_CEIL | 正の無限大方向へ丸める |
| 3 | ROUND_FLOOR | 負の無限大方向へ丸める |
| 4 | ROUND_HALF_UP | 四捨五入(境界値は無限大方向へ丸める) |
| 5 | ROUND_HALF_DOWN | 五捨六入(境界値は0の方向へ丸める) |
| 6 | ROUND_HALF_EVEN | 偶数丸め |
| 7 | ROUND_HALF_CEIL | 正の方向へ丸める |
| 8 | ROUND_HALF_FLOOR | 負の方向へ丸める |
以下は引数にrmを持つ関数です。
- #dividedBy
- #div
- #minus
- #sub
- #plus
- #add
- #times
- #mul
- #toBinary
- #toDecimalPlaces
- #toExponential
- #toFixed
- #toHexadecimal
- #toNearest
- #toOctal
- #toPrecision
- #toSignificantDigits
- #checkRoundingDigits
- #divide
- #finalise
- #getPI
- #toStringBinary
- #calculate
- #toRPN
小数点以下の桁数(decimal places)
小数点以下の桁数を何桁に丸めるかを指定します。
以下は引数にdpを持つ関数です。
数値型(isNumeric)
計算結果(戻り値)を数値型で返す場合はTrueを指定します。
デフォルト値はFalseで文字列型で返します。
関数一覧
メイン関数
| 関数名 | 説明 | カテゴリ | 短縮形 |
|---|---|---|---|
| #absoluteValue | 絶対値 | abs | |
| #ceil | 正の無限大方向へ丸める | 丸め処理 | |
| #clampedTo | 数値を範囲内に収める | 丸め処理 | clamp |
| #comparedTo | xとyを比較 | 比較 | cmp |
| #cosine | 余弦関数 | 三角関数 | cos |
| #cubeRoot | 三乗根 | 冪根(累乗根) | cbrt |
| #decimalPlaces | 小数部の桁数 | dp | |
| #dividedBy | 除算 | 四則演算 | div |
| #dividedToIntegerBy | xをyで除算した整数部 | divToInt | |
| #equals | xとyが等しいか | 比較 | eq |
| #floor | 負の無限大方向へ丸める | 丸め処理 | |
| #greaterThan | xがyより大きいか | 比較 | gt |
| #greaterThanOrEqualTo | xがy以上か | 比較 | gte |
| #hyperbolicCosine | 双曲余弦関数 | 双曲線関数 | cosh |
| #hyperbolicSine | 双曲正弦関数 | 双曲線関数 | sinh |
| #hyperbolicTangent | 双曲正接関数 | 双曲線関数 | tanh |
| #inverseCosine | 逆余弦関数 | 逆関数 | acos |
| #inverseHyperbolicCosine | 逆双曲線余弦関数 | 逆双曲線関数 | acosh |
| #inverseHyperbolicSine | 逆双曲線正弦関数 | 逆双曲線関数 | asinh |
| #inverseHyperbolicTangent | 逆双曲線正接関数 | 逆双曲線関数 | atanh |
| #inverseSine | 逆正弦関数 | 逆関数 | asin |
| #inverseTangent | 逆正接関数 | 逆関数 | atan |
| #isFinite | 有限値か | 真偽値 | |
| #isInteger | 整数か | 真偽値 | isInt |
| #isNaN | NaNか | 真偽値 | |
| #isNegative | 負数か | 真偽値 | isNeg |
| #isPositive | 正数か | 真偽値 | isPos |
| #isZero | 0か | 真偽値 | |
| #lessThan | xがyより小さいか | 比較 | lt |
| #lessThanOrEqualTo | xがy以下か | 比較 | lte |
| #logarithm | 対数もしくは常用対数 | 対数 | log |
| #minus | 減算 | 四則演算 | |
| #modulo | 剰余(余り) | mod | |
| #negated | xの正負を反転 | neg | |
| #plus | 加算 | 四則演算 | |
| #precision | 有効桁数 | sd | |
| #round | #rmを使用した丸め処理 | 丸め処理 | |
| #sine | 正弦関数 | 三角関数 | sin |
| #squareRoot | 平方根 | 冪根(累乗根) | sqrt |
| #tangent | 正接関数 | 三角関数 | tan |
| #times | 乗算 | 四則演算 | |
| #toBinary | 10進数を2進数に変換 | 進数変換 | |
| #toDecimalPlaces | 小数点以下を丸める | 丸め処理 | toDP |
| #toExponential | 指数表記に変換 | ||
| #toFixed | 小数点以下を丸める | 丸め処理 | |
| #toFraction | 既約分数にした配列を求める | ||
| #toHexadecimal | 10進数を16進数に変換 | 進数変換 | toHex |
| #toJSON | |||
| #toNearest | 指定した倍数に最も近い値への丸め処理 | 丸め処理 | |
| #toNumber | #decimal-instance | ||
| #toOctal | 10進数を8進数に変換 | 進数変換 | |
| #toPower | 累乗 | pow | |
| #toPrecision | 指定した有効桁数、丸めモードで丸めた文字列を返す | ||
| #toSignificantDigits | 指定した有効桁数、丸めモードで丸めた#decimal-instanceを返す | toSD | |
| #toString | #decimal-instanceを文字列型に変換 | ||
| #truncated | 小数点以下を切り捨て、0の方向へ丸める。 | trunc | |
| #valueOf |
ヘルパー関数
#main-functionの内部で補助するために使われている関数。
| 関数名 | 説明 |
|---|---|
| #digitsToString | 配列dに格納されている数字を桁合わせして結合 |
| #checkInt32 | 数値が32ビット符号付き整数(-2,147,483,648 ~ 2,147,483,647)、もしくはmin以上max以下の範囲内にあるか |
| #checkRoundingDigits | 丸め処理の妥当性を検証 |
| #convertBase | strに指定された文字列をbaseInの進数からbaseOutの進数に変換します |
| #cosine2 | #cosineのヘルパー関数 |
| #divide | #dividedByのヘルパー関数 |
| #finalise | #decimal-instanceを指定した有効桁数、丸めモードで丸めます |
| #finiteToString | #decimal-instanceを文字列型に変換します |
| #getBase10Exponent | \(\log_{10}{digits}\)を求める |
| #getLn10 | \(\log_{e}{10}\)をsdの有効桁数で返す |
| #getPi | 円周率をsdの有効桁数で返す。 |
| #getPrecision | xの有効桁数を返す。 |
| #getZeroString | 0をkの数だけ結合した文字列 |
| #intPow | \(k^{n}\)を返します。 |
| #isOdd | xが奇数か |
| #maxOrMin | |
| #naturalExponential | ネイピア数\(e\)を底、xを指数とする\(e^{x}\) |
| #naturalLogarithm | ネイピア数を底とした\(\log_{e}{y}\) |
| #nonFiniteToString | |
| #parseDecimal | 数値または文字列を#decimal-instanceに変換します |
| #parseOther | 特殊値を#decimal-instanceに変換します |
| #sine2 | #sineのヘルパー関数 |
| #taylorSeries | テイラー展開を計算します。正弦関数、余弦関数、双曲線正弦関数、双曲線余弦関数の計算に使用。 |
| #tinyPow | \(b^{e}\)を求める |
| #toLessThanHalfPi | 三角関数の計算で入力された角度を\(0 〜 \frac{\pi}{2}\)の範囲に正規化します |
| #toLessThanHalfPi2 | #toLessThanHalfPiの補助関数 |
| #toStringBinary | |
| #truncate |
その他関数
#helper-functionに記載はないがdecimal.jsで定義されているその他関数。
| 関数名 | 説明 |
|---|---|
| #compare | aとbを大小関係を比較 |
| #Constructor | vを符号、指数、仮数部で構成される配列(#decimal-instance)に変換 |
| #isDecimalInstance | vが#decimal-instanceか |
| #multiplyInteger | 整数同士の乗算を行う |
| #subtract | 減算 |
自作関数
Decimalモジュール (自作関数)の関数を使った計算処理を簡潔に記述するために当サイトの管理人が定義した関数。
| 関数名 | 説明 | |
|---|---|---|
| #calculate | #tokenize、#toRPN、#calcRPNの3つをまとめた関数で、文字列型で指定された計算式を逆ポーランド記法で計算した結果を返します。 | |
| #calcRPN | 逆ポーランド記法を計算します | |
| #cmpPrecedence | ||
| #isOperator | 演算子か | |
| #quotient | 除算の商の整数部を返す | |
| #tokenize | 数式をトークンに分割します | |
| #toRPN | トークンを逆ポーランド記法に変換します |
メイン関数
absoluteValue関数
xの絶対値を返します。
- x必須
- 絶対値を返す数値、文字列もしくは#decimal-instance
-12.5、1.5の絶対値を求めます。
ceil関数
xを正の無限大方向へ丸めます。
- x必須
- 丸め対象となる数値、文字列もしくは#decimal-instance
5.4、-4.9を正の無限大方向へ丸めます。
clampedTo関数
数値を指定した範囲内に収めます。xがminより小さい場合はminに、maxよりも大きい場合はmaxに丸め込み、それ以外はそのまま返します。
- x必須
- 範囲内に収める対象となる数値、文字列もしくは#decimal-instance
- min必須
- 下限値
- max必須
- 上限値
150を0から100の範囲内に収めます。上限値の100を上回っているので100となります。
- 結果
-5を0から100の範囲内に収めます。下限値の0を下回っているので0となります。
- 結果
25を0から100の範囲内に収めます。下限値の0を上回っていて、上限値の100を下回っているので、25をそのまま返します。
- 結果
comparedTo関数
x、yの値を比較し、大小関係を数値で返します。
- x必須
- 大小を比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 大小を比較する2つ目の数値、文字列もしくは#decimal-instance
戻り値は以下の表に示すとおりです。
| 戻り値 | 説明 |
|---|---|
| 1 | xがyより大きい |
| -1 | xがyより小さい |
| 0 | xとyは同値 |
| NaN | どちらか一方または両方がNaN |
5と1を比較します。xがyより大きいので1を返します。
- 結果
-5と20を比較します。xがyより小さいので-1を返します。
- 結果
5と5を比較します。同値なので0を返します。
- 結果
10とNaNを比較します。一方がNaNなのでNaNを返します。
- 結果
cosine関数
x(弧度法)の余弦(斜辺と底辺の比)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0.25ラジアンの余弦を求めます。
- 結果
弧度法(ラジアン単位)で指定する場合はdegToRad関数 (自作関数)を使って度数法を弧度法に変換します。以下は度数法で30°の余弦を求めています。cos30°の値は\(\frac{\sqrt{3}}{2} = 0.8660254038\)です。
- 結果
cubeRoot関数
xの三乗根を返します。
- x必須
- 三乗根を求める対象となる数値、文字列もしくは#decimal-instance
9、125、-1000の三乗根を返します。
decimalPlaces関数
xの小数部の桁数を返します。
- x必須
- 小数部の桁数を求める対象となる数値、文字列もしくは#decimal-instance
1.235、-27の小数部の桁数を返します。
dividedBy関数
dividendをdivisorで割った値を返します。
- dividend必須
- 被除数となる数値、文字列もしくは#decimal-instance
- divisor必須
- 除数となる数値、文字列もしくは#decimal-instance
6を9で割った値を返します。
- 結果
精度を指定するにはprecisionプロパティを使います。精度を5桁に指定しています。
- 結果
丸めモードで丸め方を指定することもできます。デフォルトでは四捨五入ですが、以下ではDecimal.ROUND_FLOORで負の無限大方向へ丸めています。
- 結果
特殊値同士の計算結果は以下のようになります。
- 結果
dividedToIntegerBy関数
xをyで除算した整数部を返します。
- x必須
- 被除数となる数値、文字列もしくは#decimal-instance
- y必須
- 除数となる数値、文字列もしくは#decimal-instance
12を5で除算した整数部を返します。
- 結果
equals関数
xとyが等しいかを示すブール値を返します。xとyが等しければTrue、等しくなければFalseを返します。
- x必須
- 比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 比較する2つ目の数値、文字列もしくは#decimal-instance
1.0と1が等しいかを示すブール値を返します。表記が違っていても数値的に等しければTrueを返します。
- 結果
floor関数
xを負の無限大方向へ丸めた値を返します。
- x必須
- 丸め対象となる数値、文字列もしくは#decimal-instance
4.2を負の無限大方向へ丸めた値を求めます。
- 結果
-2.1を負の無限大方向へ丸めた値を求めます。
- 結果
greaterThan関数
xがyより大きいかを示すブール値を返します。xがyよりも大きければTrue、小さければFalseを返します。
- x必須
- 大小を比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 大小を比較する2つ目の数値、文字列もしくは#decimal-instance
0.1が0.2より大きいかを示すブール値を返します。0.1 > 0.2は成り立たないのでFalseを返します。
- 結果
greaterThanOrEqualTo関数
xがy以上かを示すブール値を返します。xがyと等しいか、もしくは大きければTrue、そうでなければFalseを返します。
- x必須
- 大小を比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 大小を比較する2つ目の数値、文字列もしくは#decimal-instance
0.3が0.2以上かを示すブール値を返します。0.3 >= 0.2が成り立つのでTrueを返します。
- 結果
hyperbolicCosine関数
双曲線余弦(ハイパボリック コサイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
- 結果
- 結果
hyperbolicSine関数
双曲線正弦(ハイパボリック サイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
- 結果
hyperbolicTangent関数
双曲線正接(ハイパボリック タンジェント)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
- 結果
inverseCosine関数
逆余弦(アークコサイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
- 結果
inverseHyperbolicCosine関数
逆双曲線余弦(アーク・ハイパボリック・コサイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
inverseHyperbolicSine関数
逆双曲線正弦(アーク・ハイパボリック・サイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0ラジアンの逆双曲線正弦を求めます。
- 結果
inverseHyperbolicTangent関数
逆双曲線正接(アーク・ハイパボリック・タンジェント)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0ラジアンの逆双曲線正接を求めます。
- 結果
inverseSine関数
逆正弦(アークサイン)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0ラジアンの逆正弦を求めます。
- 結果
inverseTangent関数
逆正接(アークタンジェント)を求めます。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0ラジアンの逆正接を求めます。
- 結果
isFinite関数
xが有限値かを示すブール値を返します。xが有限値であればTrue、有限値以外(NaN、INF、-INF)であればFalseを返します。
- x必須
- 有限値かを求める数値、文字列もしくは#decimal-instance
2が有限値かを求めます。
- 結果
-INFが有限値かを求めます。
- 結果
isInteger関数
xが整数かを示すブール値を返します。xが整数であればTrue、整数でなければFalseを返します。
- x必須
- 整数値かを求める数値、文字列もしくは#decimal-instance
256、256.0、3.14が整数かを求めます。
isNaN関数
xが非数(NaN)かを示すブール値を返します。xが非数であればTrue、非数でなければFalseを返します。
- x必須
- 非数かを求める数値、文字列もしくは#decimal-instance
- 結果
- 結果
isNegative関数
xが負数かを示すブール値を返します。xが負数であればTrue、負数でなければFalseを返します。
- x必須
- 負数かを求める数値、文字列もしくは#decimal-instance
isPositive関数
xが正数かを示すブール値を返します。xが正数であればTrue、正数でなければFalseを返します。
- x必須
- 正数かを求める数値、文字列もしくは#decimal-instance
isZero関数
xが0かを示すブール値を返します。xが0であればTrue、0でなければFalseを返します。
- x必須
- 0かを求める数値、文字列もしくは#decimal-instance
lessThan関数
xがyよりも小さい値かを示すブール値を返します。xがyよりも小さい値であればTrue、それ以外であればFalseを返します
- x必須
- 大小を比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 大小を比較する2つ目の数値、文字列もしくは#decimal-instance
lessThanOrEqualTo関数
xがy以下の値かを示すブール値を返します。xがy以下の値であればTrue、それ以外であればFalseを返します。
- x必須
- 大小を比較する1つ目の数値、文字列もしくは#decimal-instance
- y必須
- 大小を比較する2つ目の数値、文字列もしくは#decimal-instance
logarithm関数
baseを底とする対数\(\log_{base}{x}\)を求めます。baseを省略した場合は、底をとする常用対数\(\log_{10}{x}\)を求めます。
- x必須
- 真数
- base省略可
- 底(省略時は10)
\(\log_{2}{8}\)を求めます。
- 結果
\(\log_{10}{100}\)を求めます。baseは省略されているので10となります。
- 結果
minus関数
minuendからsubtrahendを引いた値を返します。
- minuend必須
- 被減数となる数値、文字列もしくは#decimal-instance
- subtrahend必須
- 減数となる数値、文字列もしくは#decimal-instance
1.00から0.33を引いた値を返します。
- 結果
特殊値同士の計算結果は以下のようになります。
- 結果
modulo関数
xをyで割ったときのあまりを求めます。
- x必須
- 被除数となる数値、文字列もしくは#decimal-instance
- y必須
- 除数となる数値、文字列もしくは#decimal-instance
19を5で割った余りを求めます。\(19 \div 5 = 3 \mod 4\)なので4を返します。
- 結果
1を0.3で割った余りを求めます。\(1 \div 0.3 = 3 \mod 0.1\)なので0.1を返します。
- 結果
-10.2を2で割った余りを求めます。\(-10.2 \div 2 = -5 \mod 0.2\)なので0.2を返します。
- 結果
negated関数
xの正負を反転した値を返します。
- x必須
- 正負を反転する数値、文字列もしくは#decimal-instance
1.5の正負を反転させます。
- 結果
-3.1の正負を反転させます。
- 結果
plus関数
augendにaddendを加えた値を返します。
- augend必須
- 被加数となる数値、文字列もしくは#decimal-instance
- addend必須
- 加数となる数値、文字列もしくは#decimal-instance
- pr省略可
- 有効桁数
- rm省略可
- 丸めモード
0.1に0.2を加えた値を返します。
- 結果
特殊値同士の計算結果は以下のようになります。
- 結果
precision関数
xの有効桁数を返します。
- x必須
- 有効桁数を求める数値、文字列もしくは#decimal-instance
- z省略可
- 末尾の0を有効桁数としてカウントするかを示すブール値
1.23の有効桁数を求めます。
- 結果
5640000の有効桁数を求めます。sdを省略した場合は末尾の0を有効桁数としてカウントしないため564の桁数である3を返します。sdにTrueを指定した場合は末尾の0も有効桁数としてカウントするため5640000全体の桁数である7を返します。
- 結果
round関数
#rmを使用しxを整数に丸めます。
- x必須
- 丸める数値、文字列もしくは#decimal-instance
10.4を丸めます。
- 結果
sine関数
xの正弦(斜辺と対辺の比)を求めます。xはラジアン単位で指定します。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
0ラジアンの正弦を求めます。
- 結果
squareRoot関数
xの平方根を返します。
- x必須
- 平方根を求める対象となる数値、文字列もしくは#decimal-instance
4の平方根を求めます。
- 結果
tangent関数
xの正接(底辺と対辺の比)を求めます。xはラジアン単位で指定します。
- x必須
- 弧度法による角度を表す数値、文字列もしくは#decimal-instance
45°の正接を求めます。
- 結果
times関数
multiplierにmultiplicandを掛けた値を返します。
- multiplier必須
- 被乗数となる数値、文字列もしくは#decimal-instance
- multiplicand必須
- 乗数となる数値、文字列もしくは#decimal-instance
3.5に2を掛けた値を返します。
- 結果
特殊値同士の計算結果は以下のようになります。
- 結果
toBinary関数
10進数を2進数に変換します。
- x必須
- 2進数に変換する数値、文字列もしくは#decimal-instance
- sd省略可
- 有効桁数
- rm省略可
- #rm
10進数の8を2進数に変換します。
- 結果
toDecimalPlaces関数
小数値を指定した桁、丸めモードで丸めます。
- x必須
- 丸め対象となる数値、文字列もしくは#decimal-instance
- dp省略可
- 小数点以下の桁数
- rm省略可
- #rm(デフォルト:4の四捨五入)
8.125を小数点以下2桁に丸めます。
- 結果
8.125を小数点以下2桁に切り捨てで(0の方向へ)丸めます。
- 結果
toExponential関数
指数表記に変換します。
- x必須
- 数値、文字列もしくは#decimal-instance
- dp省略可
- 小数点以下の桁数
- rm省略可
- #rm
256を指数表記に変換します。
- 結果
toFixed関数
小数点以下の数値を丸めます。
- x必須
- 数値、文字列もしくは#decimal-instance
- dp省略可
- 小数点以下の桁数
- rm省略可
- #rm
12.3456を小数点以下0桁(整数)に丸めます。
- 結果
12.3456を小数点以下2桁に丸めます。
- 結果
-22.8を整数に丸めます。
- 結果
toFraction関数
xに指定された数値を既約分数にした配列を返します。配列の0番目が分子、1番目が分母となります。
- x必須
- 数値、文字列もしくは#decimal-instance
- maxD省略可
- 最大分母
0.131を既約分数にした配列を返します。
- 結果
toFraction関数の戻り値を以下のようにJOIN関数で結合すると分数の形式にすることができます。0.131は131/1000で表すことができます。
- 結果
maxDを指定すると分母がその値を超えない範囲で表されます。
maxDに500を指定したことで131/1000で表されていた値が30/229となります。この値は小数に直すと0.131004366812227074となり誤差が発生します。
- 結果
toHexadecimal関数
10進数を16進数に変換します。
- x必須
- 数値、文字列もしくは#decimal-instance
- sd省略可
- 精度
- rm省略可
- #rm
10進数の128を16進数に変換します。
- 結果
toNumber関数
x(#decimal-instance)を数値型に変換します。数値として表現できない部分は丸められる可能性があります。
- x必須
- 数値、文字列もしくは#decimal-instance
toOctal関数
10進数の値を8進数に変換します。
- x必須
- 8進数に変換する数値、文字列もしくは#decimal-instance
- sd省略可
- 有効桁数
- rm省略可
- #rm
10進数の128を8進数に変換します。
- 結果
toPower関数
baseのexponent乗の値を計算します。
- base必須
- 底
- exponent必須
- 指数
\(2^{10}\)を計算します。
- 結果
以下は\(2^{100}\)を求めるプログラムです。桁数が多くなる場合は指数表記となります。
- 結果
toPrecision関数
xをsd、rmで指定された有効桁数、丸めモードで丸めた値を文字列型で返します。
- x必須
- 丸める数値、文字列もしくは#decimal-instance
- sd省略可
- 有効桁数
- rm省略可
- 丸めモード
123.5を有効桁数2桁で丸めます。
- 結果
123.5を有効桁数2桁、#rmを0(無限大の方向)で丸めます。
- 結果
toSignificantDigits関数
xをsd、rmで指定された有効桁数、丸めモードで丸めた値の#decimal-instanceを返します。
- x必須
- 丸める数値、文字列もしくは#decimal-instance
- sd省略可
- 有効桁数
- rm省略可
- 丸めモード
1234.567を有効桁数5桁に丸めます。
- 結果
- 1234.6/result]
toString関数
xに指定されたDecimalインスタンスを文字列型に変換します。
- x必須
- 数値、文字列もしくは#decimal-instance
truncated関数
小数点以下を切り捨て、0の方向へ丸めます。
- x必須
- 丸める対象となる数値、文字列もしくは#decimal-instance
123
valueOf関数
- x必須
ヘルパー関数
digitsToString関数
配列dに格納されている値を整えて文字列として返します。配列の0番目を除く各要素をLOGBASEに定義されている桁数(デフォルト:7)になるまで0埋めして結合します。結合したあと末尾の0は削除します。
- d必須
- 結合する数字を格納した配列
以下は1/123456を計算する過程で出てくるdの値を例にしています。
配列の0番目を除く各要素(5184、331778、1234000)を7桁に0埋め(0005184、0331778、1234000)して結合します。
0番目の要素も含めて結合、末尾の0を取り除くと結果は81000518403317781234となります。
- 結果
convertBase関数
strに指定された文字列をbaseInの進数からbaseOutの進数に変換します
- str必須
- 進数変換する文字列
- baseIn必須
- 変換前の進数
- baseOut必須
- 変換後の進数
以下は16進数のFFを10進数に変換するプログラムです。
- 結果
2進数の0101を10進数に変換します。
- 結果
getPI関数
円周率をsd、rmに指定したの精度、丸めモードで返す。
- Ctor必須
- sd必須
- 精度
- rm必須
- #rm
- 結果
getZeroString関数
引数kに指定された値だけ0を結合した文字列を返します。
- k必須
- 結果
naturalExponential関数
ネイピア数\(e\)を底、xを指数とする\(e^{x}\)を求めます。
- x必須
- 指数を表す数値、文字列もしくは#decimal-instance
- sd省略可
\(e^{1}\)を求めます。
- 結果
naturalLogarithm関数
ネイピア数\(e\)を底とした自然対数\(\log_{e}{y}\)を求めます。
- y必須
- 真数を表す数値、文字列もしくは#decimal-instance
- sd省略可
nonFiniteToString関数
配列xの非有限値を文字列型に変換します。NaN、INF、-INFのいずれかの値を返します。
- x必須
- 非有限値か求める数値、文字列もしくは#decimal-instance
parseDecimal関数
引数strに指定された値を指数、仮数部の配列に変換し配列xに格納します。
parseDecimal関数を実行するよりも前に配列xに符号を示す値を格納しておく必要があります。
- x必須
- 数値、文字列もしくは#decimal-instance
- str必須
仮数部は\(1 \leq d < 10\)の範囲の値です。
Decimalモジュール (自作関数)では配列の0番目に符号、1番目に指数、2番目以降に仮数部を格納しています。
以下はarrayに格納された値をparseDecimal関数で変換するプログラムです。
仮数部は小数点の位置を中心として7桁区切りで格納されます。7桁に満たない部分は0で残りの桁を埋めます。
- 結果
tinyPow関数
\(b^{e}\)を求めます。
- b必須
- 底
- e必須
- 指数
\(2^{10}\)を求めます。
- 結果
その他関数
compare関数(division)
aとbを比較し、aが大きければ1、bが大きければ-1、同じであれば0を返します。
- a必須
- 数値a
- b必須
- 数値b
- aL必須
- 数値aの長さ
- bL必須
- 数値bの長さ
Constructor関数
vの数値を符号、指数、仮数部で構成される配列に変換します。符号は正数であれば1、負数であれば-1、仮数部はデフォルトでは7桁区切りの配列となります。
- v必須
- 数値
以下は12345を配列にするプログラムです。出力される値は1が符号、4が指数、12345が仮数部です。
- 結果
以下は-0.00225634を配列にするプログラムです。
vが負の値なので符号は-1、指数は-3、仮数部は22563、4000000となります。
- 結果
multiplyInteger関数(division)
整数同士の乗算を行うための関数です。引数xはセーフ配列、引数kは整数、引数baseは係数配列の基数を指定します。
- x必須
- 数値、文字列もしくは#decimal-instance
- k必須
- base必須
以下は123125000×5の計算を行うプログラムです。
Constructor関数で取得した配列xの0番目は符号、1番目は指数、2番目以降が仮数部が格納されていて符号と指数は不要なので、arrayShift関数 (自作関数)を2回実行して先頭2つの要素を削除します。
- 結果
自作関数
calculate関数
decimal.jsで複雑な計算を行う場合はメソッドチェーンで記述することができますが、UWSCではメソッドチェーンを定義できないので、その代わりとなる関数です。
- str必須
- 計算式
- pr省略可
- 有効桁数
- rm省略可
- 丸めモード
以下は#calculateで使える演算子です。
| 演算子 | 記号 | 説明 |
|---|---|---|
| 加算 | + | 2値を足し算する |
| 減算 | - | 2値を引き算する |
| 乗算 | * | 2値を掛ける |
| 除算 | / | 2値を割る |
| 整数除算 | // | 除算した整数部を返す |
| 剰余 | % | 除算した余りを返す |
以下は#calculateで使用できる関数です。
| 関数名 | 説明 |
|---|---|
| floor関数 | 小数点以下を切り捨てる |
| ceil関数 | 小数点以下を切り上げる |
式を文字列で指定することでその計算結果を返します。
- 結果
calcRPN関数
#torpnで生成した逆ポーランド記法のトークン(token)から計算した結果を出力します。
- tokens必須
- トークン
- pr必須
- 有効桁数
- rm必須
- #rm
cmpPrecedence関数
- token1必須
- token2必須
isOperator関数
引数tokenが演算子(+、-、*、/、%、^のいずれか)ならばTrueを返します。
- token必須
- 演算子かを調べる文字列
quotient関数
除算の商の整数部を返します。
- dividend必須
- 被除数
- divisor必須
- 除数
tokenize関数
引数exprに指定された数式をトークンに分解した配列を生成します。
トークンとは意味のある最小単位の文字の並びのことで、tokenize関数では数式を数値、演算子、括弧に分割した配列を生成します。
- expr必須
- 文字列型の計算式
以下のプログラムは数式(123+456)*10をトークンに分割した配列の各要素を出力します。
- 結果
toRPN関数
#tokenizeで生成した配列を逆ポーランド記法(RPN)に変換します。
逆ポーランド記法とは、数式を記述する際に演算子を被演算子の後ろに記述する記法です。例えば普段使われる中置記法で2 + 3と書く数式を逆ポーランド記法では2 3 +と記述します。
演算子の優先順位を考慮する必要がなく、数式の評価を効率的に行うことができます。
