IDLメモ 数値・文字列の表記

整数定数

型を指定するsuffix (b, s, l, ll) を付加しない場合、Integer とみなされる。Integerの範囲に収まらないときは Long や 64-bit Long となる。ただし、COMPILE_OPT IDL2 または COMPILE_OPT DEFINT32 を指定している場合には、最低でも Long になる。

表記できる絶対値の最大 10進表記 16進表記 (従来) 16進表記 (IDL 8.6.1以降) 8進表記 (従来) (注3) 8進表記 (IDL 8.9以降) 2進表記 (IDL 8.9以降)
Byte 255 123b '7b'xb - '173'ob, "173b 0o173b 0b1111011b
Integer (注2) 32767 (注1) 123s, 123 '7b'xs, '7b'x 0x7bs, 0x7b '173'os, "173s, '173'o, "173 0o173s, 0o173 0b1111011s, 0b1111011
Unsigned Integer (注2) 65535 123us '7b'xus, '7b'xu 0x7bus, 0x7bu '173'ous, "173us, '173'ou, "173u 0o173u 0b1111011u
Long (注2) 231-1 (注1) 123l '7b'xl 0x7bxl '173'ol, "173l 0o173l 0b1111011l
Unsigned Long (注2) 232-1 123ul '7b'xul 0x7bul '173'oul, "173ul 0o173ul 0b1111011ul
64-bit Long 263-1 (注1) 123ll '7b'xll 0x7bll '173'oll, "173ll 0o173ll 0b1111011ll
Unsigned 64-bit Long 264-1 123ull '7b'xull 0x7bull '173'oull, "173ull 0o173ull 0b1111011ull

注1: Integer型のリテラルが表現できる範囲は-32767~32767 であり -32768 は含まれない。Integer型変数に格納できる範囲とは異なる。-32768 と表記すると Long 型になってしまう。Integer 型の -32768 を得るには、-32767 - 1 とか、'8000'xs と表記する。Long および 64-bit Long でも同様。

注2: COMPILE_OPT IDL2 または COMPILE_OPT DEFINT32 を指定している場合には、型suffixを指定しない整数は32-bit(Long または Unsigned Long)以上になる。

注3: ダブルクォーテーション用いた8進表記(例: "77)は文字列と紛らわしいので避けるのが無難。

浮動小数点数定数

Fortranと似ている。

整数.整数E指数

各部分は省略可能。例えば、1.、1E、1E0、1.E、は全て1.0に等しい。デフォルトの型は 32-bit FLOATとなる。64-bit Double型にするには、E を D にかえる。

IDL 8.9以降で、COMPILE_OPT IDL3 または COMPILE_OPT FLOAT64 を指定している場合には、型を明示的に指定しない浮動小数点定数は64-bit Double (倍精度) になる。

1E または 1Dのように指数部を省略するとき、あるいは 1E+23 のように指数部に正の符号を使うときは、EまたはD直後のスペースの有無で意味が変わってしまうので注意。1E+23 は 1023 を意味するが、1E + 23 は加算とみなされ 24.0 となる。

複素数定数 (complex, dcomplex)

複素数定数は実部と虚部から構成される。実部と虚部は両方とも単精度または倍精度浮動小数点数である。複素数定数は complex (単精度) または dcomplex (倍精度) 関数で与える。

complex(Real_Part, Imaginary_Part)
complex(Real_Part) ; 虚部が0の複素数

IDL 8.9からは型suffix i または j を使うことで、次のように表記することもできる。

1 + 2i
3i ; 虚部が0の複素数
4di ; 倍精度

多倍長整数 (BigInteger)

IDL 8.4以降では BigInteger クラスを用いることで多倍長整数を表記できる。

a = BigInteger(123456)
b = BigInteger('12345678901234567890')
c = BigInteger('123456789abcdef', radix=16) ; 16進表記
d = BigInteger('0x123456789abcdef') ; IDL 8.9以降

文字列定数

文字列定数は、シングルクオート(')またはダブルクオート(")で囲まれた、0文字以上の文字列からなる。IDL 8.6以前では、ダブルクオートの直後に数字がくると、8進数として解釈しようとしてエラーとなる。

print,'abc' ; abc が表示される
print,"abc" ; abc が表示される
print,"1abc" ; IDL8.6以前ではエラー (IDL 8.6.1以降ではOK)

文字列中にクオートを含めるには、クオートを2つ続けるか、別の種類のクオートで囲む。

print,'Don''t' ; Don't が表示される
print,"Don't" ; Don't が表示される
print,"Don''t" ; Don''t が表示される

制御文字 (string)

string 関数を使うことで、ASCIIコードで 0x00~0x1F と 0x7F に割り当てられている制御文字を表現することが出来る。たとえば、string(27b) はANSIエスケープコードを表す。制御文字をコンソールに表示したときの効果は入出力を参照。

未定義値

!NULLは未定義の変数(またはnull pointerやnull object)と等価のシステム定数。IDL8で導入された。空の配列 [] や空の構造体 {} も !NULL と等価。ある変数が存在するかどうかを調べるには !NULL と比較する。またある変数を削除しその変数が使用していた記憶域を解放するときは !NULL を代入する。関数の戻り値が不要な時に !NULL に代入するという使い方もできる。

a=1
print, a ne !null ? 'defined' : 'undefined' ; defined が表示される
a=!null
print, a ne !null ? 'defined' : 'undefined' ; undefined が表示される
print, n_elements(a) ; 0 が表示される
print,[] eq !null, {} eq !null ; 1 1 が表示される (空の配列・構造体と等価)
!null = where(indgen(10) gt 3, count) ; countには6が入る
[] = where(indgen(10) gt 3, count) ; !null は [] と等価なのでこのような書き方もできる

西田圭佑 (NISHIDA Keisuke)
nishida at kwasan.kyoto-u.ac.jp