プチコンまとめArchive

変数の内部保存形式

パンくずリスト

このページの最終更新 : 2022/09/20 (火) 12:44:03

-0 (整数値)

プチコンのSmileBASICでは、興味深い数値を得ることができます。それはどうやって変数を保存しているかという点ですが、バグを晒しています。
たとえば、

  1. Z=FLOOR(-524287.1)

として、変数Zにこの値を代入します。

ここで、?Zとすると-0と表示されます。
しかし、?Z*1?Z+0?Z-0ではOverflowエラーが出てしまいます。

プチコンの小数保存の形式

プチコンではすべての数を、32ビット固定小数点という独特な形式で保持しています。 おそらくビット演算子(ANDやXORなど)を使用した時の、予期せぬエラー防止でしょう。

では今回は -250.125 という値を例に取ってみましょう。

Minus250dot125_32bit-2.png

符号ビットは 0でプラス、1でマイナスとなります。 この図では符号ビットが 1なので -になり、整数部分は &B11111010 で 250 となります。
小数部分はビットを逆から読み 1/&B100 で 1/8=0.125 となります。
これをすべてまとめると-250.125となります。

切り捨てられる小数

プチコンは、小数部に12ビット割り当てています。2の12乗が4096であることから、小数は最小保存単位は1/4096となります。 それは、この2行のプログラムからも分かります。

  1. IF (1/4096) == 0 THEN PRINT ”1/4096 ト 0 ハオナシ゛”
  2. IF (1/4097) == 0 THEN PRINT ”1/4097 ト 0 ハオナシ゛”

このプログラムでは2行目の1/4097 ト 0 ハオナシ゛のみ表示されます。 つまり 1/4097より小さい小数は切り捨てられます。

-0のビットの保存

Minus0_32bit.png

符号ビット以外が0であるため、インタプリタはこの数字を「負のゼロ」と認識します。

Z=-0の時の、他の演算結果は次のようになります。

戻り
Z==0(偽、False)
Z<0(真、True)
NOT Z524287
Z%3-2
Z OR 1-524287
HEX$(Z)”80000”
ABS(Z)-0
SGN(Z)-1
EXP(Z)
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)警告なしにフリーズ

参考

CHECKER FLAG (ひとことコメント)

コメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)