## moodssの数式

### 目次:

- 1. この文章について
- 2. 式
  - 2.1. オペランド
  - 2.2. 演算子
  - 2.3. ファンクション
  - 2.4. エラー処理
- 3. 書式
- 4. 高度な使用方法

### 1. この文章について

この文書は、moodssアプリケーションでロードされたモジュールのデータセルから数式を作成するための一般的情報と参考情報を含んでいます。一度作成された式は、moodssの一般ドキュメントで説明されているformulas tablesにて表示されます。
またこの文書は、シンタックス、演算子、関数から構成される式において、使用可能な数式を列挙します。

### 2. 式

moodssとmoompsの数式は、ユーザーが定義した名前、コメント、データセルで作られた数学的式、数学的演算子、関数、から構成されます。数学的式は数式が中心となっています。

式は、オペランド（データセル、数、数学関数、…）、演算子（+、-、…）、および括弧の組み合わせから構成されます。オペランド、演算子、括弧の間にスペースを使用します。数式の結果を内部で計算される際に無視されます。

例えば、スクリーンショットは、コンピュータで使用されているメモリーを、そのコンピュータ全体が使用可能なメモリーで割り、結果に100を乗算することによって、メモリ使用量のパーセントを計算するために用いる式です。

与えられた結果が0ですが、実際に使用されているメモリーは幾らかあるはずですので、この式には不具合があることに気が付きます。それは、内部の計算エンジン（以下計算機と呼ぶ）がオペランドを整数値として解釈しているからです。
このケースの場合、下に図示されるているように、メモリーオペランドのうちの1つを浮動小数点に変換するために、数学的関数を用いて浮動小数点計算をするのが望ましいでしょう。

私達は、今後より多くの式をカバーする予定です。

#### 2.1. オペランド

もしオペランドが整数値（123などの）として解釈が可能ならば整数値として扱われ、その他は浮動小数点数値（12.345などの）として扱われます。
オペランドは、定数としてユーザーにより直接入力されるか（上記のスクリーンショットにある乗数100のように）、またはデータセルのようなどのソースからでも使用できます（使用メモリーや使用可能メモリーなど）。

整数と浮動小数点のオペランド内部での変換が必要な場合は自動的に実行されます。演算計算には浮動小数点数が入力されるまで整数を使用し、その後に浮動小数点数を使用します。例えば、5/4の結果は1ですが、5/4.0の結果は1.25になります。
浮動小数点数を、整数値と区別して表示するため、.（ドット）またはeを使用します。例えば、20.0/5.0の結果は、4ではなく、4.0です。

オペランドは、上記の形式で値を返すdouble(127544)などの数学関数の場合もあります。(関数を参照)。

#### 2.2. 演算子

式は下記リストの優先順位に従って評価されます。演算子は優先順位の高い順に上から並べています：

- - + ~ ! 単項マイナス、単項プラス、ビットワイズNOT、論理NOT。ビットワイズNOTは整数にのみ適用可能。
- * / % 乗算、除算、剰余。剰余は整数にのみ適用可能。結果の符号は常に除数の符号と同じであり、除数よりも小さな絶対値です。
- + - 加算、減算。
- << >> 左シフト、右シフト。整数にのみ適用可能。右シフトは常に式の符号を維持します。
- < > <= >= より少ない、より大きい、等しいかより少ない、等しいかより大きい。もし条件が等しい場合は1を返し、等しくない場合は0を返します。
- == != 等価、非等価。もし条件が等しい場合は1を返し、等しくない場合は0を返します。
- & ビットワイズAND。整数オペランドにのみ適用可能。
- ^ ビットワイズXOR（排他的論理和）。整数オペランドにのみ適用可能。
- | ビットワイズOR。整数オペランドにのみ適用可能。
- && 論理AND。2つのオペランドが両方とも1の場合だけ、結果も1になります。ブーリアン、数（整数または浮動小数点）のオペランドにのみ適用可能。
- || 論理OR。2つのオペランドのどちらかが1であれば、結果も1になります。ブーリアン、数（整数または浮動小数点）のオペランドにのみ適用可能。

#### 2.3. 関数

厳密に言えば、下記の特定の関数は唯一の引数として１つのデータセル(moodss formulasインターフェースにドラッグアンドドロップ)が必要です。初期ロード時、データセルの値が不明であり未定義の値を返す可能性があるため、formulasのアップデートの際に、内部的にデータセルの値を使用するためです。

- delta(cell) データセルの現在の値と、整数フォームの最終値との違いを返します。例えば,絶えず増加し続け、しばらくして最初に戻る32ビットカウンターにて使用した場合も絶えず明確な違いを返します。int(cell - last(cell))と同様の値。
- delta(cell) Returns the difference between the current value of a data cell and its last value, in 64 bit integer form. Equivalent to:
  wide(cell - last(cell)).
  Note: handles 64 bit counters that always grow and wrap around:
  wide(1 - 18446744073709551615) = 2
- delta32(cell) Returns the difference between the current value of a data cell and its last value, in 32 bit integer (always positive) form. Equivalent to:
  (cell - last(cell)) & 0xFFFFFFFF.
  Note: handles 32 bit counters that always grow and wrap around:
  (1 - 4294967295) & 0xFFFFFFFF = 2, (1 - 2) & 0xFFFFFFFF = 4294967295
- diff(cell) データセルの現在の値と、最大の精度を持つ浮動小数点フォームの最終値との違いを返します 。double(cell - last(cell))と同様の値。
- last(cell) 最後にアップデートした時のデータセルの値を返します。

Notes:

- Before moodss 21.2 and moomps 5.6, delta() behaved differently on 32 and 64 bit platforms: this has been solved by using either delta() or delta32() based on the handled data and expected behavior.
- 式は、ポーリング時間までに定義されるように、ダッシュボードがリフレッシュされる時に通常コア（moodssまたはmoomps）によりアップデートされます。式のアップデートは、最新の時間に埋め込まれたデータセルの値を使用すること、および場合によっては式の最後のアップデートの時のセルのうちのいくつかの値で式の結果が評価されるのを意味しています（もしdiff()、delta()、delta32()、またはlast()の関数を使用した場合）。もし式が、非同期のモジュールインスタンスに属しているいくらかのデータセルを含んでいる場合、式は、ダッシュボードリフレッシュレート（ポーリング時間）と無関係に、非同期構成のデータセルの価値が変更され、絶えずアップデートされます（または評価されます）。式が評価されるたびに、最後のアップデート時間（diff(time)を参照）の値が更新されます。

アップデート時間の違いを返す特別な関数もあります:

- diff(time) 現在の時間と、浮動小数点フォームの最後のアップデート時間との秒差を返します。 例えば、"diff(cell) / diff(time)"という式は、データセルの成長率を返します。

以下の数学関数がサポートされています。この関数は特に指定しない限り浮動小数点数で動作します：

- abs(number) numberの絶対値を返します。numberは整数、もしくは浮動小数点数であり、結果は同じフォーマットが返されます。
- acos(number) numberのアークコサイン、[-PI/2,PI/2]の範囲を返します。numberの範囲は[-1,1]でなければなりません。
- asin(number) numberのアークサイン、[-PI/2,PI/2]の範囲を返します。numberの範囲は[-1,1]でなければなりません。
- atan(number) numberのアークタンジェント、[-PI/2,PI/2]の範囲を返します。
- atan2(y,x) 座標y/xから求められたラジアン単位の角度、範囲[-PI/2,PI/2]の値を返します。x、yは0ではありません。もしxが0より大きい場合、atan(y/x)と等しい。
- ceil(number) 浮動小数点数number以上で最小の整数を返します。
- cos(number) numberのコサインをラジアン値で返します。
- cosh(number) numberの双曲線余弦値を返します。結果がオーバフローを起こした場合はエラーを返します。
- double(number) もしnumberが浮動小数点数の場合はその値を返し、そうでない場合はnumberを浮動小数点数に変換した値を返します。
- exp(number) numberを指数とするe(自然対数の底) の累乗を返します。結果がオーバフローを起こした場合はエラーを返します。
- floor(number) 浮動小数点数number以下で最大の整数を返します。
- fmod(x,y) x/yの浮動小数点剰余を返します。もしyが0の場合はエラーを返します。
- hypot(x,y) 直角三角形sqrt(x*x+y*y)の斜辺の長さを返します。
- int(number) もしnumberが機械語として同じ幅の整数値であるならば、リターンnumberは切頭によってnumberを整数（機械語、すなわち32ビットシステムの32ビットと同じサイズ、および64ビットシステムの64ビットの間の）に違った形で変換し、変換された値を戻します。
- log(number) numberの自然対数を返します。numberは正数でなければなりません。
- log10(number) 10を底とするnumberの対数を返します。numberは正数でなければなりません。
- pow(x,y) 引数yを指数とする引数xの累乗を返します。もしxが負数の場合、yは整数でなければなりません。
- round(number) もしnumberが整数の場合はその値を返し、そうでない場合はnumberを整数に丸めた値を返します。
- sin(number) numberのサインをラジアン値で返します。
- sinh(number) numberの双曲線正弦値を返します。結果がオーバフローを起こした場合はエラーを返します。
- sqrt(number) numberの平方根を返します。numberは負数であってはなりません。
- tan(number) numberのタンジェントをラジアン値で返します。
- tanh(number) numberの双曲線正接値を返します。
- wide(number) numberを最低64ビットの幅（もしnumberが32ビット数の場合は符号を拡張します）の整数値に変換した値を返します。

#### 2.4. エラー処理

エラー処理は内部計算機により処理され、ほとんどのメッセージ内容は容易に理解できます。しかし、エラーメッセージを慎重に読み、よく考察することが必要です。
Note: エキスパートのために、safe Tclインタプリタ中のexprコマンドがエラーを報告します。

いくつかの典型的エラーメッセージを説明します。

- syntax error in expression "...": variable references require preceding $: 恐らく、幾つかのアルファベット文字が迷い込んでいるか、無効な数学関数が式に含まれていることを意味します。
- syntax error in expression "...": premature end of expression: 括弧が閉じられていない可能性があります。

### 3. 書式

(to be implemented)

### 4. 高度な使用方法

オペランドの整数値は10進数（通常）、8進数（オペランドの最初の文字が0の場合）、16進数（オペランドの最初の2文字が0xの場合）で指定できます。

浮動小数点は、ANSIに準拠するCコンパイラにより受け入れ可能なすべての方法で指定できます（f、F、l、L接尾辞が許可されていないという点を除く）。例えば、以下全ては有効な浮動小数点です：2.1、3.、6e4、7.91e+16。もし、数値の解釈が不可能な場合はエラーになります。それは、?で表現されます。

以下の式が有効です:

- x?y:z Cと同様にif-then-elseとなります。もしxの評価がnon-zeroの場合はyの値、そうでない場合はzの値を返します。

以下のランダム関数がサポートされています:

- rand() 範囲[0,1]の浮動小数点数値を偽似乱数で返します。rand関数の各結果は、後に呼び出すrand関数の結果まで、すべての値を決定します。ジェネレータのseedはマシンの内部クロックで初期設定されるか、もしくはsrand関数で設定できます。
- srand(number) numberは整数でなければならず、rand関数の乱数ジェネレータのseedをリセットするために用いられます。そのseedの最初の乱数値（randを参照）を返します。

最後に、Tcl言語に精通しているユーザーのため、データセルの値を入力した後に、数式のテキストがexprコマンドに直接渡されるので、オペランドとして文字列を含むすべてのexprコマンドの機能を使用することが出来ます。