プチコンのSmileBASICでは、興味深い数値を得ることができます。それはどうやって変数を保存しているかという点ですが、バグを晒しています。
たとえば、
- Z=FLOOR(-524287.1)
として、変数Zにこの値を代入します。
ここで、?Zとすると-0と表示されます。
しかし、?Z*1や?Z+0、?Z-0ではOverflowエラーが出てしまいます。
プチコンではすべての数を、32ビット固定小数点という独特な形式で保持しています。 おそらくビット演算子(ANDやXORなど)を使用した時の、予期せぬエラー防止でしょう。
では今回は -250.125 という値を例に取ってみましょう。
符号ビットは 0でプラス、1でマイナスとなります。
この図では符号ビットが 1なので -になり、整数部分は &B11111010 で 250 となります。
小数部分はビットを逆から読み 1/&B100 で 1/8=0.125 となります。
これをすべてまとめると-250.125となります。
プチコンは、小数部に12ビット割り当てています。2の12乗が4096であることから、小数は最小保存単位は1/4096となります。 それは、この2行のプログラムからも分かります。
- IF (1/4096) == 0 THEN PRINT ”1/4096 ト 0 ハオナシ゛”
- IF (1/4097) == 0 THEN PRINT ”1/4097 ト 0 ハオナシ゛”
このプログラムでは2行目の1/4097 ト 0 ハオナシ゛のみ表示されます。 つまり 1/4097より小さい小数は切り捨てられます。
符号ビット以外が0であるため、インタプリタはこの数字を「負のゼロ」と認識します。
Z=-0の時の、他の演算結果は次のようになります。
式 | 戻り |
---|---|
Z==0 | 0(偽、False) |
Z<0 | 1(真、True) |
NOT Z | 524287 |
Z%3 | -2 |
Z OR 1 | -524287 |
HEX$(Z) | ”80000” |
ABS(Z) | -0 |
SGN(Z) | -1 |
EXP(Z) | 0 |
DEG(Z) | 369214.3505859 |
ATAN(Z) | -1.5708078(これは-PI()/2と同じ) |
ATAN(0,Z) | 3.14160156 |
ATAN(Z,0) | -1.57080078 |
ATAN(Z,Z) | -2.35620117(これは-PI()*3/4と同じ) |
SIN(Z) | 警告なしにフリーズ |
COS(Z) | 警告なしにフリーズ |
TAN(Z) | 警告なしにフリーズ |
コメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)