制限

 
 
 

整数除算による切り捨て

データ型を宣言せずに、定数や変数に対して算術演算を実行すると、使用されている値に応じてデータ型が推測されます。たとえば、次の文を見てください。

float $where = 1/2; // Result: 0

1 と 2 には小数点がないため、整数として扱われます。このエクスプレッションは整数 1 を整数 2 で割っています。結果は整数で商は 0、余りは 1 になります。余りは Maya により切り捨てられます。

where は float 変数なので、整数値 0 は浮動小数点値 0 に変換され(これらは同じ値です)、この値が where に代入されます。値の小数部分を取得するには、integer (整数)型の被演算数の 1 つを float に変換する必要があります。

float $there = 1/2.0; // Result: 0.5

2.0 には小数点があるため、浮動小数点値として扱われます。数値 1 は float に変換され、float 型の除算が行われて、結果として得られた値 0.5 が there に代入されます。除算の小数部分を維持するもう 1 つの方法は次のとおりです。

float $youGo = float(1)/2;

この例では、値 1 は float に変換されるため、値 2 も float に変換されます。この結果、float 型の除算が行われ、小数部分が維持されます。

精度と最大数値サイズ

string、matrix、または array の最大サイズは、コンピュータで使用可能なメモリの量によってのみ決まります。しかし、float と int の場合は、精度と最大サイズに対する制限があります。

int の最大サイズは C 言語の場合と同じで、コンピュータによって異なります。多くのコンピュータでは、この範囲は -2,147,483,648 から 2,147,483,647 です。

float の最大精度と範囲は、C 言語の double と同じで、コンピュータによって異なります。浮動小数点数は精度に限界があり、長い演算ではラウンド誤差が累積する場合があります。しかし、float データ型の精度は比較的高いため(小数点以下約 15 桁)、多くの場合、ラウンド誤差が問題になることはありません。

範囲の循環

変数の範囲には制限があります。この範囲を超えた場合、望ましい結果は得られません。

int $mighty = 2147483647 + 1; // Result: -2147483648
int $radical = -2147483648 - 1; // Result: 2147483647
int $buddy = 2147483648; // Result: -2147483648
int $man = 2147483647 + 2; // Result: -2147483647

変数の最大範囲を超えた場合、変数の値は変数の最小値に循環します。また、変数の最小範囲を下回った場合、変数の値は変数の最大値に循環します。

float $GG = 1.5 + 1000000000 * 3; // Result: -1294967294.5

この例では、演算子の優先順位のため、乗算が先に行われます。乗算は 2 つの int に対して実行されるため、結果の型は int になります。この乗算の結果得られる値は int の最大範囲を超えてしまうため、値の循環が発生します。

次の計算は、内部的に起こっていることを表しています。

$GG = 1.5 + 1000000000 * 3;
$GG = 1.5 + 3000000000; // Maxumum int range exceded
$GG = 1.5 + 3000000000 + (2147483648) - (2147483648.0);
$GG = 1.5 + 3000000000 + (-2147483648) - (2147483648.0);
$GG = 1.5 + 3000000000 - 4294967296;
$GG = 1.5 + -1294967296;
$GG = -1294967294.5;