Asakusa Frameworkのアドベントカレンダーはこつこつ書いていて、ついでにJava Advent Calendar 2019に空きがあるから書こうかなーと思ったけど今見たら全部埋まっていたので、カレンダーではないけれど書くだけ書いておきます。
メソッドの戻り値の配列の書き方とか、昔から知ってたけど書きそびれていたので良いネタではあるけど、今回は十六進浮動小数点リテラルについてです。
ちょっと前に浮動小数点のNaNについて話題になったことがあって、そのときにjava.lang.Doubleのソースを見ていたら、MAX_VALUEの定義が「0x1.fffffffffffffP+1023」になっていて、「Eは知ってるけどPって何だ?」と思ったのがきっかけです。
これは、SigSasakiさんによると十六進浮動小数点数というものらしいです。
Javaの浮動小数点はIEEE754の規約に従っていますが、十六進浮動小数点数もそれに含まれているようです。
浮動小数点数は内部では二進数で保持されるので、二進数(表記上は十六進数)で表した方が確実な場合があるのかもしれません。ちょうどMAX_VALUEがそんな感じですし。
でもJava言語仕様を見ても、Pを使った書き方は載ってないんですよね…。
と思ったら、Java8のJLSには載ってました^^;
歴代のjava.lang.Doubleを見てみると、JDK1.5のMAX_VALUEは「1.7976931348623157e+308; // 0x1.fffffffffffffP+1023」であり、Pを使った書き方になったのはJDK1.6からのようです。
でも実際に自分でPを使ってコンパイルしてみると、JDK1.4ではエラー、JDK1.5では通りました。
どの言語仕様(JLS)で追加されたのか確認したい…と思ったのですが、現在公開されているJLSで最も古いものはJava6なので、JDK1.5や1.4は確認できませんでしたorz
しかし色々ググってみたところ、JDK1.5のjava.mathの機能拡張に「16進数の浮動小数のサポート」というトピックがあるのを見つけたので、JDK1.5で追加されたという事で間違いないと思います。
自分が浮動小数点リテラルの書き方を勉強したのはJLS3の頃ですし、JDK1.5が出て注目されていたときも、誰も十六進浮動小数点リテラルには言及していなかったと思います。
そりゃ知らなくても無理は無し!w