【FlowScript講座】第3回 簡単な数値計算


[管理者]
KHCmaster
今回は簡単な数値計算を行います。

さっそく、整数における四則演算(+,-,×,÷)をFlowScript上で行ってみましょう。

まずは足し算です。
これにはInt32.Addを使用します。Int32.AddはA+Bという計算結果がValueに入ります。
ので、適当にA=1, B=1として、Valueを出力してみると2になっているのが分かりますね。


今度は引き算です。
Int32.Subtractを使用します。Int32.SubtractはA-Bという計算結果がValueに入ります。
今度はA=-1,B=-3として、Valueを出力してみると2になっているのが分かりますね。

さらに掛け算です。
Int32.Multiplyを使用します。Int32.MultiplyはA×Bという計算結果がValueに入ります。
A=1,B=2としてValueを出力してみると2になっていますね。

最後に割り算です。
Int32.Devideを使用します。Int32.DevideはA÷Bという計算結果がValueに入ります。
A=4,B=2としてValueを出力してみると2になりますね。

ここまでは皆さんが習ってきた算数、数学に沿う結果が得られていると思います。
しかし、残念ながらこのInt32.*の演算には予想に反する結果が得られる場合があります。
それを以下で細かく見ていきます。

まず、最後にやったDevideです。先ほどはA=4,B=2でしたが、これをA=3,B=2にしてみるとどうなるでしょうか?
どうせ「1.5」だろ?と思うかもしれませんが結果はそうではありません。

なんと1です。他にも簡単に動作を確認できるので、適当な数値をいれて実験してみてください。
ここでは、実行例として
A=5,B=2→Value=2(普通:2.5)
A=-4,B=3→Value=-1(普通:-1.33333...)
を上げておきます。これらに共通することは小数部分がなくなっているということです。
割り算を行うときには、小数部分がなくなる(切り捨てられる)ことに注意しましょう。

さらに、DevideでみておくべきなのはB=0を設定したときの結果です。
A=1(0以上の数)のときはValueは2147483647になり、A=-1(0未満の数)のときは-2147483648になります。
意に反する結果になることに注意しておきましょう。

次に設定可能な値です。
Aを設定するときにA=1000000000000000000000000000にしようとするとエラーがでます。値が大きすぎるということです。
いくらまでなら入力可能かというと-2147483648~2147483647です。どこかで見ましたね、この数値。
先ほどの0で割ったときの結果です。実は0で割ったときには符号(+か-か)に応じてInt32.MaxかInt32.Minを返すようになっています。
この値はInt32.Max, Int32.Minを使うことで簡単に確認できます。

最後に演算のオーバーフローというものを説明します。
さきほどの入力可能な範囲に収まりかつ非常に大きい数値でInt32.Multiplyをやってみましょう。
ここではInt32.Maxを使用してみます。

なんと結果が1になっています。これには深い理由(0と1の世界での理由)があるのですが、小難しい話はおいておきましょう。
ここで重要なことは計算結果がInt32.Min~Int32.Maxの範囲外になるような場合、計算結果が通常とは異なるということが重要です。

ここまで整数における計算のみを扱ってきました。
知的好奇心旺盛なかたはA,Bに値を設定するときに小数を入れてみたと思いますが、小数ではエラーが出て設定できないとおもいます。
これはなぜかというとInt32というのは範囲の限定された整数を表すもので小数には対応していないからです。

では、小数を扱うにはどうすればいいのでしょうか?
それは別のノードを使います。Float.*かDouble.*を使えば小数を表すことができることが多いです。
非常に歯切れの悪い説明ですが、コンピューター上ではメモリが有限なのでいかなる数(無限個ある)も表せるようにすることは不可能だからです。
とはいうものの大体大丈夫なので、現在のコンピューターではこの小数の扱い方が一般に使用されています。
Int32と同様にAdd,Subtract,Multiply,Devideを使えば四則演算が可能です。

FloatとDoubleの違いはなんでしょうか?
それぞれのMaxを見てみると分かります。

上がFloatの最大値で、下がDoubleの最大値です。
見たことがない表記なので戸惑うかも知れませんが、E+xxxというのは10のxxx乗ということです。
つまりFloatの最大値は3.402823×10の38乗、Doubleは1.79769313486232×10の308乗となります。
Floatに比べ、Doubleの方が範囲は広いですね。さらに、前の部分(小数表記の部分)の桁数も長いことが分かります。
このようにFloatに比べDoubleの方が皆さんの馴染み深い「数の世界」を表しているといえます。
他にもいろいろあるのですが、あまり説明しても混乱を招くだけなのでこの辺でやめておきます。

今回のまとめですが

・四則演算はAdd, Subtract, Multiply, Devideでできる
・Int32は有限の範囲の整数を表す数
・Float, Doubleは有限の範囲の小数を表す数
・*.Max, *.Minでその数の最大値、最小値を取得できる

となります。
他にも色々演算、定義値はあるのですが、その内紹介しようと思います。
次回は条件分岐について説明を行う予定です。
作成日時:2013-05-18 17:20:08 更新日時:2013-05-18 17:21:40
FlowScript講座をフォーラムを使って開講中です。