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;
多分バグでしょうけど、いつからだろ(もう手元に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;
いわゆる非公式の仕様ってやつなんでしょうか。