我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

2進法のフォーマット

XPTビューワで対応するフォーマットを増やそうとして調べていて気がついたのですが、ちょっとおかしなところを見つけました


binaryフォーマット/インフォーマットとは、10進数を2進数に変換するフォーマットです。(ここではinformatについて言及)
BINARY infomat


1つ目

以下では、123を2進数に変換し、再度inputで2進数から10進数に戻しているのですが、
フォーマットの長さが57を超えると正しく変換されなくなります。(57から62まで)

data _null_;
  length binary $64;
  a=123;
  /* 正しい */
  put 'binary56.';
  binary=put(a,binary56.);
  put binary=;
  reverse=input(binary,binary56.);
  put reverse=;
  put 'binary57.';
  binary=put(a,binary57.);
  put binary=;
  /* 正しくない */
  reverse=input(binary,binary57.);
  put reverse=;
run;
f:id:japelin:20211006180516p:plain
結果。2進数は正しくできているように見えるが、10進数に戻す処理が一致しない。


多分バグでしょうけど、いつからだろ(もう手元に8.2も9.1.3も9.2も9.3もないので検証できないですが、まぁいりませんねw)

2つ目

SASのドキュメントには、binaryインフォーマットはマイナスの値を読めない、と記載されています。
しかし、実際には64bit、つまり64桁のバイナリ値であれば、正しくマイナスを復元できます。

data _null_;
  length binary $64;
  a=-123;
  /* 正しい */
  put 'binary64.';
  binary=put(a,binary64.);
  put binary=;
  reverse=input(binary,binary64.);
  put reverse=;
  /* 正しくない */
  put 'binary63.';
  binary=put(a,binary63.);
  put binary=;
  reverse=input(binary,binary63.);
  put reverse=;
run;
f:id:japelin:20211006181700p:plain
結果。64桁の場合だけ、正しくマイナス値となっている。


いわゆる非公式の仕様ってやつなんでしょうか。