プチコンまとめWiki (初代/mkII)

変数の内部保存形式

-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 (ひとことコメント)

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


表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.083 秒 | このページの最終更新 : 2022/09/20 (火) 12:44:03 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30