$10^9$のような整数の定数を書くとき、1000000000
では0が何個あるかすぐに分からないです。
そこで、1000*1000*1000
のように式を書けば、コンパイル時に計算結果の定数となります。
そんな時に
1e9という定数
とあるc++のソースで、int m=1e9;
と書いてあり、指数表現の定数なのでしょうが、そういえばJavaでも書けたかなということで、久々に言語仕様を探してみた。
3.10.2 Floating-Point Literals
結論を言えば、1e9
と書けますが、double型です。1e9d
も同様です。1e9f
はfloat型になります。
整数型は、10進数、8進数、16進数のパターンしかありません。
そこで、整数のdouble値をint型にダウンキャストすれば、$10^9$の定数に使えそうです。
さらに、long型も$10^{18}$で試してみる。
{
int v1 = (int)1e9;
int v2 = (int)2e9;
int v3 = Integer.MAX_VALUE;
System.out.printf("%,d %,d %,d", v1, v2, v3);
System.out.println();
}
{
long v1 = (long)1e18;
long v2 = (long)9e18;
long v3 = Long.MAX_VALUE;
System.out.printf("%,d %,d %,d", v1, v2, v3);
System.out.println();
}
実行結果
1,000,000,000 2,000,000,000 2,147,483,647
1,000,000,000,000,000,000 9,000,000,000,000,000,000 9,223,372,036,854,775,807
18個の0を数えるのは大変なので、カンマと付けましたが、意外と便利かもと思いました。
最小値の初期値としてよくMAX_VALUEを使いますが、計算の途中でオーバーフローする可能性1を気にする手間を考えると、$10^9$を2倍しても収まるのでちょうどよい感じの定数です。
BinaryExponentIndicator: one of p P
せっかくJava言語仕様を開いたので、浮動小数点の定数を見たのですが、最後に謎のpの文字。
標準ライブラリのDoubleクラスにありました。
仮数部と指数部なんて何十年前2に勉強したのでしょうか。
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
ということは、1は0x1p+0
なのかな。
{
double v1 = 0x1p+0;
double v2 = 0x1p+31;
double v3 = 0x0.8p+0;
double v4 = 0x0.1p+0;
System.out.printf("%f %f %f %f", v1, v2, v3, v4);
System.out.println();
}
実行結果
1.000000 2147483648.000000 0.500000 0.062500
さすがdouble型です、仮数部が52ビットあるので、int型の範囲なら抜け落ちません。
最初に0x0.1p+0
を指定して0.0625
と出てきて、ああ、16進数の小数です。2進数で表現すると0.0001p+0
みたいな感じ。
ちなみに、1p+0
とは書けません。こちらは16進数オンリーです。