number

数値型は実数を表します。


taiseiue | 2024-11-21

定義

名前空間: Alice
アセンブリ: Losetta.dll

数値型は実数を表します。数値型は算術関係ビット演算子をサポートしています。

AliceScriptの数値型の表現できるおおよその範囲は、±5.0 × 10−324 - ±1.7 × 10308(-15~17桁)で、サイズは8バイトです。

数値型の既定値はゼロ0です。また、数値型で非数、正方向の無限、負方向の無限を表す定数がそれぞれ、NaN-∞として定義されています。

数値型への暗黙的な変換は存在しません。型変換演算子(as)を使用するかConvertメソッドを使って、文字列型、bool型、bytes型からの明示的な変換がサポートされています。また、数値型専用のメソッドは存在しません。この型の型指定修飾子はnumberです。

AliceScriptの数値型では小数点以下の計算が予想通りにいかない場合があります。数値型の計算誤差の記事を参照してください。

AliceScript
namespace Alice;
public class number;

対応
AliceScript RC1、RC2、GM、2.0、2.1、2.2、2.3、3.0
AliceSister GM、2.0、2.1、2.2、2.3、3.0
Losetta 0.8、0.9、0.10

説明

数値型は、\({ -1.7976931348623157 \times 10^{308} }\)から\({1.7976931348623157 \times 10^{308} }\)までの範囲の数および非数(NaN)をAliceScriptで表現することを表しています。この型は、惑星や銀河間の距離などの非常に大きな値から物質の分子量などの非常に小さな値まで表せる代わりに、しばしば値を不正確にを表すこともあります。 AliceScriptの数値型は、2進浮動小数点数演算のIEC 60559:1989 (IEEE 754) 標準に準拠しています。

数値型の最大値と最小値は、それぞれmath_maxValuemath_minValue定数を用いて取得できます。

数値型の変数の定義

数値型を定義するには以下の2つの方法があります。

数値リテラル

コード中に直接数値を書き込むには、数値リテラルを使用します。コード中には10進数で数値を記述できるだけでなく、2進数、8進数、16進数でも記述できます。10進数以外の表記で記述するには、数値の前に接頭辞をつける必要があります。次に、それぞれの進数と接頭辞の対応を示します。

接頭辞 進数
0b 2進数
0o 8進数
0x 16進数
(なし) 10進数

また、2進数などを記述するときは表記が長くなりすぎるので、適時アンダースコア_を記述できます。

ここまでの内容について、次に例を示します。

AliceScript
// 10進数表記
number dec = 32;

// 2進数表記 (10進数で32)
number bin = 0b_0010_0000;

// 8進数表記 (10進数で32)
number oct = 0o040;

// 16進数表記 (10進数で32)
number hex = 0x20;

文字列から変換する

ユーザーからの入力など、文字列から数値に変換するには、型演算子またはvariable.Convertメソッドを使用します。次に、型演算子asを使用して文字列から数値に変換する例を示します。

AliceScript
// 文字列
string str = "123";

// 文字列を数値型に変換する
number num = str as number;

浮動小数点表現と精度

コンピューター人間の使うような10進数で値を格納することができません。必ず2進数に変換して演算し、保存する必要があります。

たとえば、\(0.00025\)という数があったとします。この数を2進数に変換するにはまず、この数を仮数と指数、符号に分けます。分けると、次のようになります。

\[ +0.25\times10^{-3} \]
仮数 0.25
指数 -3
符号 +

10進数の小数が一部の値(\(1/3\)\(\pi\)など)を正確に表すことができないのと同様に、2進数の小数は一部の小数値を表すことができません。たとえば、\(1/10\)は10進数では\(0.1\)として正確に表せますが、2進数では、\(0.001100110011...\)と表され0011が無限に繰り返されます。 このとき、浮動小数点数値は途中で計算を停止し、値を丸めた不正確な値をとります。 また、一般的に元の浮動小数点値に対して追加の数学演算を実行すると、精度がさらに低下する傾向があります。 たとえば、\(0.1\)に10を掛けた結果と\(0.1\)\(0.1\)を9回足した結果を比較すると、後者の方がさらに8回の演算が必要なため、足し算の精度は下がります。 実際、次の例のようなことが起こります。

AliceScript
var value = 0.1;
var result1 = value * 10;
var result2 = 0;
for(var i=0;i<=10;i++){
    result2 += value;
}
print("0.1 * 10 = {0}",result1); // 出力例 : 0.1 * 10 = 1
print("0.1を10回足したもの = {0}",result2); // 出力例 : 0.1を10回足したもの = 1.09999999

一部の数値は2進数の小数として正確に表現することができないため、数値型は実数の近似しかできません。

また、数値型には有効桁数の制限があり、これによって値がどれだけ正確に実数に近似するかが決まります。数値型の精度は最大15桁です。