Decimalデシマルモジュール

本ページには広告が含まれています。

浮動小数点数の演算による誤差を防ぎ、正確な計算を行います。

構文
引数
戻り値

プログラム

UWSC

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桁)ごとに区切られます。

UWSC
結果
プレーンテキスト

#Constructorで生成した符号指数仮数部で構成される#decimal-instanceを文字列に戻すには#finiteToStringを使います。

UWSC

誤差

丸め誤差

丸め誤差とは、数値を有限の桁数で表すためにある桁以降を切り捨て、切り上げ、四捨五入することで生じる誤差。

例えば無限に続く円周率3.141592…を小数点以下3桁目を四捨五入して3.14として扱うことは、1592…が切り捨てられ丸め誤差となります。

打切り誤差

打切り誤差とは、本来無限に続く計算を途中で打ち切ることによって生じる誤差。

以下は1/3を計算した結果です。無限小数ですが、小数点以下16桁目以降は切り捨てられています。

UWSC
結果
プレーンテキスト

以下は2/3を計算した結果です。1/3の時と同様に無限小数ですが、小数点以下16桁目を四捨五入することで切り上げられています。

UWSC
結果
プレーンテキスト

#dividedByを使うと有効桁数を指定することができます。以下は1/3を有効桁数50桁に指定。

UWSC
結果
プレーンテキスト

以下は2/3を有効桁数20桁、#rm10の方向へ丸める)を指定。

UWSC
結果
プレーンテキスト

情報落ち

情報落ちとは、絶対値の大きい数と小さい数を加減算したとき、小さい数の情報が結果に反映されずに生じる誤差。

10000000000000000 + 1 - 10000000000000000を計算する例です。\(10^{16}\)という大きい数に対して1という小さい数を加算しても結果に反映されず誤差が生じます。

UWSC
結果
プレーンテキスト
UWSC
結果
プレーンテキスト

桁落ち

桁落ちとは、ほぼ等しい数を減算したときに生じる誤差。例えば0.123456789 - 0.123456788の計算を行ったとき0.1234567890.123456788は有効桁数9桁だが、計算結果の0.000000001は有効桁数1桁というように有効桁数が極端に減少することをいいます。

以下のプログラムは桁落ち以前に小数値であるために丸め誤差が発生しているため、結果が正しく出力されません。

UWSC
結果
プレーンテキスト

Decimalモジュール (自作関数)を使うと正しい結果を得られます。

UWSC
結果
プレーンテキスト

オーバーフロー/アンダーフロー

オーバーフローは、データ型で扱える範囲の上限値を超えたときに発生します。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番目の値で特殊値を表します。

decimal.js

次にUWSCでの特殊値の配列構成です。decimal.jsではNaNnullで表していた値をUWSCではNULLFALSEとして扱っています。UWSCでNaNに該当する値がないのと、特殊値を判断する分岐処理での都合によるためです。

UWSC

また特殊値を含む値の四則演算の結果は以下の表のようになります。

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#rm4
modulo剰余の定義を指定1
toExpNeg指数表記を使い始める負の指数の閾値しきいち-7
toExpPos指数表記を使い始める正の指数の閾値しきいち21
minE許容する最小指数。指数がこの数値以下になると0を返します。-9E+15
maxE許容する最大指数。指数がこの数値以上になるとINFを返します。9E+15

プロパティ値は以下のように指定することで変更できます。

UWSC

precision

有効桁数を指定します。演算結果がこの桁数に丸められます。デフォルトでは有効桁数20桁。

このプロパティはライブラリ全体の既定の有効桁数を設定するグローバル設定です。インスタンスやメソッド呼び出しで明示的に有効桁数を渡さない場合に使われます。

rounding

丸めモードを指定します。値は#rmの表にあるように0から8の値を指定できます。デフォルトでは四捨五入(4)。

このプロパティはライブラリ全体の既定の丸めモードを設定するグローバル設定です。インスタンスやメソッド呼び出しで明示的に丸めモードを渡さない場合に使われます。

modulo

剰余を求める際のモードを設定します。

プロパティ説明
ROUND_UP0無限大方向へ丸める
ROUND_DOWN10の方向へ丸める
ROUND_FLOOR3負の無限大方向へ丸める
ROUND_HALF_EVEN6偶数丸め
EUCLID9剰余は常に正数

以下の式は各モードでの基本形式です。

\[ 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を指定したときの剰余を求めるプログラムです。

UWSC
結果
プレーンテキスト
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を指定したときの剰余を求めるプログラムです。

UWSC
結果
プレーンテキスト
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を指定したときの剰余を求めるプログラムです。

UWSC
結果
プレーンテキスト
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を指定したときの剰余を求めるプログラムです。

UWSC
結果
プレーンテキスト
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を指定したときの剰余を求めるプログラムです。

UWSC
結果
プレーンテキスト

toExpNeg

負数で指数を使い始める値を指定します。

負数では指数を使い始める値(toExpNeg)は-7乗がデフォルトになっているため指数の値がそれ以下のときは指数表記となります。-6乗までは固定小数点で出力されます。

UWSC
結果
プレーンテキスト

以下は\(2^{-20}\)を求めるプログラムです。デフォルトでは-7乗で指数表記となります。

UWSC
結果
プレーンテキスト

toExpNegに負数を指定することで指数を使い始める値を指定できます。以下は負の指数の閾値を-10としています。

UWSC
結果
プレーンテキスト

toExpPos

正数で指数を使い始める値を指定します。

正数では指数を使い始める値(toExpPos)は21乗がデフォルトになっているため指数の値がそれ以上のときは指数表記となります。20乗までは固定小数点で出力されます。

UWSC
結果
プレーンテキスト

以下は\(2^{100}\)を求めるプログラムです。デフォルトでは有効桁数(precision)が20桁、正数では指数を使い始めるの値(toExpPos)が21乗なので以下のように丸められてしまいます。

UWSC
結果
プレーンテキスト

関数を実行する前にプロパティに値を指定することで結果の精度を変更できます。

以下は有効桁数を35桁、指数を使い始める値を50乗としています。大きい値を指定することで結果を丸めずに求めることができます。

UWSC
結果
プレーンテキスト

minE

許容する指数の下限値を指定します。これを下回る値はアンダフローとして扱われ0を返します。

以下は0.010.001を指数表記にするプログラムです。

UWSC
結果
プレーンテキスト

eの右側の数値が指数を表しています。

以下は指数が-3以下のときはアンダーフローとし0を返します。0.01は指数表記だと1e-2なので0.01を返しますが、0.001は指数表記だと1e-3となりminEで指定された-3以下となるので0を返します。

UWSC
結果
プレーンテキスト

maxE

許容する指数の上限値を指定します。これを上回る値はオーバーフローとして扱われINFを返します。

以下は10000000100000000を指数表記にするプログラムです。

UWSC
結果
プレーンテキスト

minEのときと同様、eの右側の数値が指数を表しています。

以下は指数が8以上のときはオーバーフローとしてINFを返します。10000000は指数表記だと1e+7なので10000000を返しますが、100000000は指数表記だと1e+8となりmaxEで指定された8以上となるのでINFを返します。

UWSC
結果
プレーンテキスト

引数

精度(Precision)

演算結果の精度を表します。この設定値を超える桁数が必要になった場合、#rmのルールに従って丸められます。デフォルトは20桁です。

特定の関数の呼び出しごとに適用するローカルな有効桁数のオーバーライドです。該当呼び出しだけに適用され、他の操作や既定値は変わりません。

演算時に一時的に計算精度を制御したいときに使います。

以下は引数にprを持つ関数です。

  1. #dividedBy
  2. #div
  3. #minus
  4. #sub
  5. #plus
  6. #add
  7. #times
  8. #mul
  9. #divide
  10. #getLN10
  11. #intPow
  12. #calculate
  13. #calcRPN
  14. #toRPN

以下は除算の結果を指定した桁数で丸めるプログラムです。

UWSC
結果
プレーンテキスト

精度が整数の桁数よりも小さい場合、先頭からprで指定された桁以降は0になります。丸めモードはデフォルトでは四捨五入(4)が指定されています。

UWSC
結果
プレーンテキスト

有効桁数(significant digits)

演算後の最終的な丸め・フォーマットを行うときに使います。

以下は引数にsdを持つ関数です。

  1. #toBinary
  2. #toHexadecimal
  3. #toOctal
  4. #toPrecision
  5. #toSignificantDigits
  6. #finalise
  7. #finiteToString
  8. #getLN10
  9. #getPI
  10. #naturalExponential
  11. #naturalLogarithm
  12. #toStringBinary

丸めモード(Rounding Mode)

演算結果を有効桁数に合わせる際の丸め方を表す整数を指定します。デフォルトは4の四捨五入です。

特定の丸め操作を行うメソッド呼び出しごとに使うローカルな丸めモードのオーバーライドです。該当呼び出しだけに適用され、他の操作や既定値は変わりません。

定数名はUWSCでは定義していないので08の値を直接指定してください。

定数名説明
0ROUND_UP無限大方向へ丸める
1ROUND_DOWN0の方向へ丸める
2ROUND_CEIL正の無限大方向へ丸める
3ROUND_FLOOR負の無限大方向へ丸める
4ROUND_HALF_UP四捨五入(境界値は無限大方向へ丸める)
5ROUND_HALF_DOWN五捨六入(境界値は0の方向へ丸める)
6ROUND_HALF_EVEN偶数丸め
7ROUND_HALF_CEIL正の方向へ丸める
8ROUND_HALF_FLOOR負の方向へ丸める

以下は引数にrmを持つ関数です。

  1. #dividedBy
  2. #div
  3. #minus
  4. #sub
  5. #plus
  6. #add
  7. #times
  8. #mul
  9. #toBinary
  10. #toDecimalPlaces
  11. #toExponential
  12. #toFixed
  13. #toHexadecimal
  14. #toNearest
  15. #toOctal
  16. #toPrecision
  17. #toSignificantDigits
  18. #checkRoundingDigits
  19. #divide
  20. #finalise
  21. #getPI
  22. #toStringBinary
  23. #calculate
  24. #toRPN

小数点以下の桁数(decimal places)

小数点以下の桁数を何桁に丸めるかを指定します。

以下は引数にdpを持つ関数です。

  1. #dividedBy
  2. #toDecimalPlaces
  3. #toExponential
  4. #toFixed
  5. #divide
  6. #div

数値型(isNumeric)

計算結果(戻り値)を数値型で返す場合はTrueを指定します。

デフォルト値はFalseで文字列型で返します。

関数一覧

メイン関数

関数名 説明 カテゴリ 短縮形
#absoluteValue 絶対値 abs
#ceil 正の無限大方向へ丸める 丸め処理
#clampedTo 数値を範囲内に収める 丸め処理 clamp
#comparedTo xyを比較 比較 cmp
#cosine 余弦関数 三角関数 cos
#cubeRoot 三乗根 冪根(累乗根) cbrt
#decimalPlaces 小数部の桁数 dp
#dividedBy 除算 四則演算 div
#dividedToIntegerBy xyで除算した整数部 divToInt
#equals xyが等しいか 比較 eq
#floor 負の無限大方向へ丸める 丸め処理
#greaterThan xyより大きいか 比較 gt
#greaterThanOrEqualTo xy以上か 比較 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 xyより小さいか 比較 lt
#lessThanOrEqualTo xy以下か 比較 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丸め処理の妥当性を検証
#convertBasestrに指定された文字列をbaseInの進数からbaseOutの進数に変換します
#cosine2#cosineのヘルパー関数
#divide#dividedByのヘルパー関数
#finalise#decimal-instanceを指定した有効桁数、丸めモードで丸めます
#finiteToString#decimal-instanceを文字列型に変換します
#getBase10Exponent\(\log_{10}{digits}\)を求める
#getLn10\(\log_{e}{10}\)をsdの有効桁数で返す
#getPi円周率をsdの有効桁数で返す。
#getPrecisionxの有効桁数を返す。
#getZeroString0kの数だけ結合した文字列
#intPow\(k^{n}\)を返します。
#isOddxが奇数か
#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で定義されているその他関数。

関数名説明
#compareabを大小関係を比較
#Constructorv符号指数仮数部で構成される配列(#decimal-instance)に変換
#isDecimalInstancev#decimal-instance
#multiplyInteger整数同士の乗算を行う
#subtract減算

自作関数

Decimalモジュール (自作関数)の関数を使った計算処理を簡潔に記述するために当サイトの管理人が定義した関数。

関数名説明
#calculate#tokenize#toRPN#calcRPNの3つをまとめた関数で、文字列型で指定された計算式を逆ポーランド記法で計算した結果を返します。
#calcRPN逆ポーランド記法を計算します
#cmpPrecedence
#isOperator演算子か
#quotient除算の商の整数部を返す
#tokenize数式をトークンに分割します
#toRPNトークンを逆ポーランド記法に変換します

メイン関数

absoluteValue関数

xの絶対値を返します。

UWSC
x必須
絶対値を返す数値、文字列もしくは#decimal-instance

-12.51.5の絶対値を求めます。

UWSC

ceil関数

xを正の無限大方向へ丸めます。

UWSC
x必須
丸め対象となる数値、文字列もしくは#decimal-instance

5.4-4.9を正の無限大方向へ丸めます。

UWSC

clampedTo関数

数値を指定した範囲内に収めます。xminより小さい場合はminに、maxよりも大きい場合はmaxに丸め込み、それ以外はそのまま返します。

UWSC
x必須
範囲内に収める対象となる数値、文字列もしくは#decimal-instance
min必須
下限値
max必須
上限値

1500から100の範囲内に収めます。上限値の100を上回っているので100となります。

UWSC
結果
プレーンテキスト

-50から100の範囲内に収めます。下限値の0を下回っているので0となります。

UWSC
結果
プレーンテキスト

250から100の範囲内に収めます。下限値の0を上回っていて、上限値の100を下回っているので、25をそのまま返します。

UWSC
結果
プレーンテキスト

comparedTo関数

xyの値を比較し、大小関係を数値で返します。

UWSC
x必須
大小を比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
大小を比較する2つ目の数値、文字列もしくは#decimal-instance

戻り値は以下の表に示すとおりです。

戻り値説明
1xyより大きい
-1xyより小さい
0xyは同値
NaNどちらか一方または両方がNaN

51を比較します。xyより大きいので1を返します。

UWSC
結果
プレーンテキスト

-520を比較します。xyより小さいので-1を返します。

UWSC
結果
プレーンテキスト

55を比較します。同値なので0を返します。

UWSC
結果
プレーンテキスト

10NaNを比較します。一方がNaNなのでNaNを返します。

UWSC
結果
プレーンテキスト

cosine関数

x(弧度法)の余弦(斜辺と底辺の比)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0.25ラジアンの余弦を求めます。

UWSC
結果
プレーンテキスト

弧度法(ラジアン単位)で指定する場合はdegToRad関数 (自作関数)を使って度数法を弧度法に変換します。以下は度数法で30°の余弦を求めています。cos30°の値は\(\frac{\sqrt{3}}{2} = 0.8660254038\)です。

UWSC
結果
プレーンテキスト

cubeRoot関数

xの三乗根を返します。

UWSC
x必須
三乗根を求める対象となる数値、文字列もしくは#decimal-instance

9125-1000の三乗根を返します。

UWSC

decimalPlaces関数

xの小数部の桁数を返します。

UWSC
x必須
小数部の桁数を求める対象となる数値、文字列もしくは#decimal-instance

1.235-27の小数部の桁数を返します。

UWSC

dividedBy関数

dividenddivisorで割った値を返します。

UWSC
dividend必須
被除数となる数値、文字列もしくは#decimal-instance
divisor必須
除数となる数値、文字列もしくは#decimal-instance

69で割った値を返します。

UWSC
結果
プレーンテキスト

精度を指定するにはprecisionプロパティを使います。精度を5桁に指定しています。

UWSC
結果
プレーンテキスト

丸めモードで丸め方を指定することもできます。デフォルトでは四捨五入ですが、以下ではDecimal.ROUND_FLOORで負の無限大方向へ丸めています。

UWSC
結果
プレーンテキスト

特殊値同士の計算結果は以下のようになります。

UWSC
結果
プレーンテキスト

dividedToIntegerBy関数

xyで除算した整数部を返します。

UWSC
x必須
被除数となる数値、文字列もしくは#decimal-instance
y必須
除数となる数値、文字列もしくは#decimal-instance

125で除算した整数部を返します。

UWSC
結果
プレーンテキスト

equals関数

xyが等しいかを示すブール値を返します。xyが等しければTrue、等しくなければFalseを返します。

UWSC
x必須
比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
比較する2つ目の数値、文字列もしくは#decimal-instance

1.01が等しいかを示すブール値を返します。表記が違っていても数値的に等しければTrueを返します。

UWSC
結果
プレーンテキスト

floor関数

xを負の無限大方向へ丸めた値を返します。

UWSC
x必須
丸め対象となる数値、文字列もしくは#decimal-instance

4.2を負の無限大方向へ丸めた値を求めます。

UWSC
結果
プレーンテキスト

-2.1を負の無限大方向へ丸めた値を求めます。

UWSC
結果
プレーンテキスト

greaterThan関数

xyより大きいかを示すブール値を返します。xyよりも大きければTrue、小さければFalseを返します。

UWSC
x必須
大小を比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
大小を比較する2つ目の数値、文字列もしくは#decimal-instance

0.10.2より大きいかを示すブール値を返します。0.1 > 0.2は成り立たないのでFalseを返します。

UWSC
結果
プレーンテキスト

greaterThanOrEqualTo関数

xy以上かを示すブール値を返します。xyと等しいか、もしくは大きければTrue、そうでなければFalseを返します。

UWSC
x必須
大小を比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
大小を比較する2つ目の数値、文字列もしくは#decimal-instance

0.30.2以上かを示すブール値を返します。0.3 >= 0.2が成り立つのでTrueを返します。

UWSC
結果
プレーンテキスト

hyperbolicCosine関数

双曲線余弦(ハイパボリック コサイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

UWSC
結果
プレーンテキスト

UWSC
結果
プレーンテキスト

hyperbolicSine関数

双曲線正弦(ハイパボリック サイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

UWSC
結果
プレーンテキスト

hyperbolicTangent関数

双曲線正接(ハイパボリック タンジェント)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

UWSC
結果
プレーンテキスト

inverseCosine関数

逆余弦(アークコサイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

UWSC
結果
プレーンテキスト

inverseHyperbolicCosine関数

逆双曲線余弦(アーク・ハイパボリック・コサイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

inverseHyperbolicSine関数

逆双曲線正弦(アーク・ハイパボリック・サイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0ラジアンの逆双曲線正弦を求めます。

UWSC
結果
プレーンテキスト

inverseHyperbolicTangent関数

逆双曲線正接(アーク・ハイパボリック・タンジェント)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0ラジアンの逆双曲線正接を求めます。

UWSC
結果
プレーンテキスト

inverseSine関数

逆正弦(アークサイン)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0ラジアンの逆正弦を求めます。

UWSC
結果
プレーンテキスト

inverseTangent関数

逆正接(アークタンジェント)を求めます。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0ラジアンの逆正接を求めます。

UWSC
結果
プレーンテキスト

isFinite関数

xが有限値かを示すブール値を返します。xが有限値であればTrue、有限値以外(NaNINF-INF)であればFalseを返します。

UWSC
x必須
有限値かを求める数値、文字列もしくは#decimal-instance

2が有限値かを求めます。

UWSC
結果
プレーンテキスト

-INFが有限値かを求めます。

UWSC
結果
プレーンテキスト

isInteger関数

xが整数かを示すブール値を返します。xが整数であればTrue、整数でなければFalseを返します。

UWSC
x必須
整数値かを求める数値、文字列もしくは#decimal-instance

256256.03.14が整数かを求めます。

UWSC

isNaN関数

xが非数(NaN)かを示すブール値を返します。xが非数であればTrue、非数でなければFalseを返します。

UWSC
x必須
非数かを求める数値、文字列もしくは#decimal-instance

UWSC
結果
プレーンテキスト

UWSC
結果
プレーンテキスト

isNegative関数

xが負数かを示すブール値を返します。xが負数であればTrue、負数でなければFalseを返します。

UWSC
x必須
負数かを求める数値、文字列もしくは#decimal-instance

UWSC

isPositive関数

xが正数かを示すブール値を返します。xが正数であればTrue、正数でなければFalseを返します。

UWSC
x必須
正数かを求める数値、文字列もしくは#decimal-instance

UWSC

isZero関数

x0かを示すブール値を返します。x0であればTrue0でなければFalseを返します。

UWSC
x必須
0かを求める数値、文字列もしくは#decimal-instance

lessThan関数

xyよりも小さい値かを示すブール値を返します。xyよりも小さい値であればTrue、それ以外であればFalseを返します

UWSC
x必須
大小を比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
大小を比較する2つ目の数値、文字列もしくは#decimal-instance

lessThanOrEqualTo関数

xy以下の値かを示すブール値を返します。xy以下の値であればTrue、それ以外であればFalseを返します。

UWSC
x必須
大小を比較する1つ目の数値、文字列もしくは#decimal-instance
y必須
大小を比較する2つ目の数値、文字列もしくは#decimal-instance

logarithm関数

baseを底とする対数\(\log_{base}{x}\)を求めます。baseを省略した場合は、底をとする常用対数\(\log_{10}{x}\)を求めます。

UWSC
x必須
真数
base省略可
底(省略時は10

\(\log_{2}{8}\)を求めます。

UWSC
結果
プレーンテキスト

\(\log_{10}{100}\)を求めます。baseは省略されているので10となります。

UWSC
結果
プレーンテキスト

minus関数

minuendからsubtrahendを引いた値を返します。

UWSC
minuend必須
被減数となる数値、文字列もしくは#decimal-instance
subtrahend必須
減数となる数値、文字列もしくは#decimal-instance

1.00から0.33を引いた値を返します。

UWSC
結果
プレーンテキスト

特殊値同士の計算結果は以下のようになります。

UWSC
結果
プレーンテキスト

modulo関数

xyで割ったときのあまりを求めます。

UWSC
x必須
被除数となる数値、文字列もしくは#decimal-instance
y必須
除数となる数値、文字列もしくは#decimal-instance

195で割った余りを求めます。\(19 \div 5 = 3 \mod 4\)なので4を返します。

UWSC
結果
プレーンテキスト

10.3で割った余りを求めます。\(1 \div 0.3 = 3 \mod 0.1\)なので0.1を返します。

UWSC
結果
プレーンテキスト

-10.22で割った余りを求めます。\(-10.2 \div 2 = -5 \mod 0.2\)なので0.2を返します。

UWSC
結果
プレーンテキスト

negated関数

xの正負を反転した値を返します。

UWSC
x必須
正負を反転する数値、文字列もしくは#decimal-instance

1.5の正負を反転させます。

UWSC
結果
プレーンテキスト

-3.1の正負を反転させます。

UWSC
結果
プレーンテキスト

plus関数

augendaddendを加えた値を返します。

UWSC
augend必須
被加数となる数値、文字列もしくは#decimal-instance
addend必須
加数となる数値、文字列もしくは#decimal-instance
pr省略可
有効桁数
rm省略可
丸めモード

0.10.2を加えた値を返します。

UWSC
結果
プレーンテキスト

特殊値同士の計算結果は以下のようになります。

UWSC
結果
プレーンテキスト

precision関数

xの有効桁数を返します。

UWSC
x必須
有効桁数を求める数値、文字列もしくは#decimal-instance
z省略可
末尾の0を有効桁数としてカウントするかを示すブール値

1.23の有効桁数を求めます。

UWSC
結果
プレーンテキスト

5640000の有効桁数を求めます。sdを省略した場合は末尾の0を有効桁数としてカウントしないため564の桁数である3を返します。sdTrueを指定した場合は末尾の0も有効桁数としてカウントするため5640000全体の桁数である7を返します。

UWSC
結果
プレーンテキスト

round関数

#rmを使用しxを整数に丸めます。

UWSC
x必須
丸める数値、文字列もしくは#decimal-instance

10.4を丸めます。

UWSC
結果
プレーンテキスト

sine関数

xの正弦(斜辺と対辺の比)を求めます。xはラジアン単位で指定します。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

0ラジアンの正弦を求めます。

UWSC
結果
プレーンテキスト

squareRoot関数

xの平方根を返します。

UWSC
x必須
平方根を求める対象となる数値、文字列もしくは#decimal-instance

4の平方根を求めます。

UWSC
結果
プレーンテキスト

tangent関数

xの正接(底辺と対辺の比)を求めます。xはラジアン単位で指定します。

UWSC
x必須
弧度法による角度を表す数値、文字列もしくは#decimal-instance

45°の正接を求めます。

UWSC
結果
プレーンテキスト

times関数

multipliermultiplicandを掛けた値を返します。

UWSC
multiplier必須
被乗数となる数値、文字列もしくは#decimal-instance
multiplicand必須
乗数となる数値、文字列もしくは#decimal-instance

3.52を掛けた値を返します。

UWSC
結果
プレーンテキスト

特殊値同士の計算結果は以下のようになります。

UWSC
結果
プレーンテキスト

toBinary関数

10進数を2進数に変換します。

UWSC
x必須
2進数に変換する数値、文字列もしくは#decimal-instance
sd省略可
有効桁数
rm省略可
#rm

10進数の8を2進数に変換します。

UWSC
結果
プレーンテキスト

toDecimalPlaces関数

小数値を指定した桁、丸めモードで丸めます。

UWSC
x必須
丸め対象となる数値、文字列もしくは#decimal-instance
dp省略可
小数点以下の桁数
rm省略可
#rm(デフォルト:4の四捨五入)

8.125を小数点以下2桁に丸めます。

UWSC
結果
プレーンテキスト

8.125を小数点以下2桁に切り捨てで(0の方向へ)丸めます。

UWSC
結果
プレーンテキスト

toExponential関数

指数表記に変換します。

UWSC
x必須
数値、文字列もしくは#decimal-instance
dp省略可
小数点以下の桁数
rm省略可
#rm

256を指数表記に変換します。

UWSC
結果
プレーンテキスト

toFixed関数

小数点以下の数値を丸めます。

UWSC
x必須
数値、文字列もしくは#decimal-instance
dp省略可
小数点以下の桁数
rm省略可
#rm

12.3456を小数点以下0桁(整数)に丸めます。

UWSC
結果
プレーンテキスト

12.3456を小数点以下2桁に丸めます。

UWSC
結果
プレーンテキスト

-22.8を整数に丸めます。

UWSC
結果
プレーンテキスト

toFraction関数

xに指定された数値を既約分数にした配列を返します。配列の0番目が分子、1番目が分母となります。

UWSC
x必須
数値、文字列もしくは#decimal-instance
maxD省略可
最大分母

0.131を既約分数にした配列を返します。

UWSC
結果
プレーンテキスト

toFraction関数の戻り値を以下のようにJOIN関数で結合すると分数の形式にすることができます。0.131131/1000で表すことができます。

UWSC
結果
プレーンテキスト

maxDを指定すると分母がその値を超えない範囲で表されます。

maxD500を指定したことで131/1000で表されていた値が30/229となります。この値は小数に直すと0.131004366812227074となり誤差が発生します。

UWSC
結果
プレーンテキスト

toHexadecimal関数

10進数を16進数に変換します。

UWSC
x必須
数値、文字列もしくは#decimal-instance
sd省略可
精度
rm省略可
#rm

10進数の128を16進数に変換します。

UWSC
結果
プレーンテキスト

toNumber関数

x#decimal-instance)を数値型に変換します。数値として表現できない部分は丸められる可能性があります。

UWSC
x必須
数値、文字列もしくは#decimal-instance

toOctal関数

10進数の値を8進数に変換します。

UWSC
x必須
8進数に変換する数値、文字列もしくは#decimal-instance
sd省略可
有効桁数
rm省略可
#rm

10進数の128を8進数に変換します。

UWSC
結果
プレーンテキスト

toPower関数

baseexponent乗の値を計算します。

UWSC
base必須
exponent必須
指数

\(2^{10}\)を計算します。

UWSC
結果
プレーンテキスト

以下は\(2^{100}\)を求めるプログラムです。桁数が多くなる場合は指数表記となります。

UWSC
結果
プレーンテキスト

toPrecision関数

xsdrmで指定された有効桁数、丸めモードで丸めた値を文字列型で返します。

UWSC
x必須
丸める数値、文字列もしくは#decimal-instance
sd省略可
有効桁数
rm省略可
丸めモード

123.5を有効桁数2桁で丸めます。

UWSC
結果
プレーンテキスト

123.5を有効桁数2桁、#rm0(無限大の方向)で丸めます。

UWSC
結果
プレーンテキスト

toSignificantDigits関数

xsdrmで指定された有効桁数、丸めモードで丸めた値の#decimal-instanceを返します。

UWSC
x必須
丸める数値、文字列もしくは#decimal-instance
sd省略可
有効桁数
rm省略可
丸めモード

1234.567を有効桁数5桁に丸めます。

UWSC
結果
1234.6/result]

toString関数

xに指定されたDecimalインスタンスを文字列型に変換します。

UWSC
x必須
数値、文字列もしくは#decimal-instance

truncated関数

小数点以下を切り捨て、0の方向へ丸めます。

UWSC
x必須
丸める対象となる数値、文字列もしくは#decimal-instance

UWSC
123

valueOf関数

UWSC
x必須
[/login]

ヘルパー関数

digitsToString関数

配列dに格納されている値を整えて文字列として返します。配列の0番目を除く各要素をLOGBASEに定義されている桁数(デフォルト:7)になるまで0埋めして結合します。結合したあと末尾の0は削除します。

UWSC
d必須
結合する数字を格納した配列

以下は1/123456を計算する過程で出てくるdの値を例にしています。

配列の0番目を除く各要素(51843317781234000)を7桁に0埋め(000518403317781234000)して結合します。

0番目の要素も含めて結合、末尾の0を取り除くと結果は81000518403317781234となります。

UWSC
結果
プレーンテキスト

convertBase関数

strに指定された文字列をbaseInの進数からbaseOutの進数に変換します

UWSC
str必須
進数変換する文字列
baseIn必須
変換前の進数
baseOut必須
変換後の進数

以下は16進数のFFを10進数に変換するプログラムです。

UWSC
結果
プレーンテキスト

2進数の0101を10進数に変換します。

UWSC
結果
プレーンテキスト

getPI関数

円周率をsdrmに指定したの精度、丸めモードで返す。

UWSC
Ctor必須
sd必須
精度
rm必須
#rm
UWSC
結果
プレーンテキスト

getZeroString関数

引数kに指定された値だけ0を結合した文字列を返します。

UWSC
k必須

UWSC
結果
プレーンテキスト

naturalExponential関数

ネイピア数\(e\)を底、xを指数とする\(e^{x}\)を求めます。

UWSC
x必須
指数を表す数値、文字列もしくは#decimal-instance
sd省略可

\(e^{1}\)を求めます。

UWSC
結果
プレーンテキスト

naturalLogarithm関数

ネイピア数\(e\)を底とした自然対数\(\log_{e}{y}\)を求めます。

UWSC
y必須
真数を表す数値、文字列もしくは#decimal-instance
sd省略可

nonFiniteToString関数

配列xの非有限値を文字列型に変換します。NaNINF-INFのいずれかの値を返します。

UWSC
x必須
非有限値か求める数値、文字列もしくは#decimal-instance

parseDecimal関数

引数strに指定された値を指数仮数部の配列に変換し配列xに格納します。

parseDecimal関数を実行するよりも前に配列x符号を示す値を格納しておく必要があります。

UWSC
x必須
数値、文字列もしくは#decimal-instance
str必須
\[ 符号 \times 仮数部 \times 10^{指数} \]

仮数部は\(1 \leq d < 10\)の範囲の値です。

Decimalモジュール (自作関数)では配列の0番目に符号、1番目に指数、2番目以降に仮数部を格納しています。

以下はarrayに格納された値をparseDecimal関数で変換するプログラムです。

仮数部は小数点の位置を中心として7桁区切りで格納されます。7桁に満たない部分は0で残りの桁を埋めます。

UWSC
結果
CSV

tinyPow関数

\(b^{e}\)を求めます。

UWSC
b必須
e必須
指数

\(2^{10}\)を求めます。

UWSC
結果
プレーンテキスト

その他関数

compare関数(division)

abを比較し、aが大きければ1bが大きければ-1、同じであれば0を返します。

UWSC
a必須
数値a
b必須
数値b
aL必須
数値aの長さ
bL必須
数値bの長さ

Constructor関数

vの数値を符号指数仮数部で構成される配列に変換します。符号は正数であれば1、負数であれば-1、仮数部はデフォルトでは7桁区切りの配列となります。

UWSC
v必須
数値

以下は12345を配列にするプログラムです。出力される値は1符号4指数12345仮数部です。

UWSC
結果
プレーンテキスト

以下は-0.00225634を配列にするプログラムです。

vが負の値なので符号-1指数-3仮数部225634000000となります。

UWSC
結果
プレーンテキスト

multiplyInteger関数(division)

整数同士の乗算を行うための関数です。引数xはセーフ配列、引数kは整数、引数baseは係数配列の基数を指定します。

UWSC
x必須
数値、文字列もしくは#decimal-instance
k必須
base必須

以下は123125000×5の計算を行うプログラムです。

Constructor関数で取得した配列xの0番目は符号、1番目は指数、2番目以降が仮数部が格納されていて符号指数は不要なので、arrayShift関数 (自作関数)を2回実行して先頭2つの要素を削除します。

UWSC
結果
プレーンテキスト

自作関数

calculate関数

decimal.jsで複雑な計算を行う場合はメソッドチェーンで記述することができますが、UWSCではメソッドチェーンを定義できないので、その代わりとなる関数です。

UWSC
str必須
計算式
pr省略可
有効桁数
rm省略可
丸めモード

以下は#calculateで使える演算子です。

演算子記号説明
加算+2値を足し算する
減算-2値を引き算する
乗算*2値を掛ける
除算/2値を割る
整数除算//除算した整数部を返す
剰余%除算した余りを返す

以下は#calculateで使用できる関数です。

関数名説明
floor関数小数点以下を切り捨てる
ceil関数小数点以下を切り上げる

式を文字列で指定することでその計算結果を返します。

UWSC
結果
プレーンテキスト

calcRPN関数

#torpnで生成した逆ポーランド記法のトークン(token)から計算した結果を出力します。

UWSC
tokens必須
トークン
pr必須
有効桁数
rm必須
#rm

cmpPrecedence関数

UWSC
token1必須
token2必須

isOperator関数

引数tokenが演算子(+-*/%^のいずれか)ならばTrueを返します。

UWSC
token必須
演算子かを調べる文字列

quotient関数

除算の商の整数部を返します。

UWSC
dividend必須
被除数
divisor必須
除数

tokenize関数

引数exprに指定された数式をトークンに分解した配列を生成します。

トークンとは意味のある最小単位の文字の並びのことで、tokenize関数では数式を数値演算子括弧に分割した配列を生成します。

UWSC
expr必須
文字列型の計算式

以下のプログラムは数式(123+456)*10をトークンに分割した配列の各要素を出力します。

UWSC
結果
プレーンテキスト

toRPN関数

#tokenizeで生成した配列を逆ポーランド記法(RPN)に変換します。

逆ポーランド記法とは、数式を記述する際に演算子を被演算子の後ろに記述する記法です。例えば普段使われる中置記法で2 + 3と書く数式を逆ポーランド記法では2 3 +と記述します。

演算子の優先順位を考慮する必要がなく、数式の評価を効率的に行うことができます。

UWSC
tokens必須
#tokenizeで生成した配列
pr省略可
有効桁数
rm省略可
#rm