goo blog サービス終了のお知らせ 

ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java 十六進浮動小数点リテラル

2019-12-08 12:10:54 | PG(Java)

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


IteratorをIterableに変換する方法

2019-11-29 00:48:36 | PG(Java)

ツイッター上でRayStark77さんがEnumerationからfor-each構文を使う方法を書いていて、それをnagiseさんがブログに残すと言うので、自分も便乗してIteratorのページを作ってIterableに変換する方法を書きました。

こちらが書く前にmike_neckさんが先に書いてしまいましたがw
Enumeration を使いやすくする(Iterable にする/Iterator にする)

なお、元の話題はEnumerationでしたが、自分はEnumerationは使わないので、代わりにStreamの例にしておきました。
個人的には、StreamのforEachメソッドを使うよりはfor-each構文を使いたいんですよね。
例外発生時のスタックトレースや、デバッグでステップ実行するときに分かりやすいので。


Java13 プレビュー版テキストブロック

2019-09-22 23:48:39 | PG(Java)

ちょっと遅めの夏休みをとってゴロゴロしてたら、2019/9/17にJava13が出ていた^^;

Java13ではAPIにはあまり変化が無いようだ。
新しいSocket APIが加わったようだけど、もし将来ソケット通信をしなきゃいけなくなったら見ることにしよう。

Java12で導入されたswitch式がJava13で正式版になるのかと思ったら、Java13でもプレビュー版のままだった。
switch式の値を返す語がbreakからyieldになったからなのかな。

目新しいのはテキストブロック。複数行にまたがった文字列を書くのに便利な構文がプレビュー版として導入されていた。
インデントの整合性をとる機能があったり、意外と高機能かもw
Stringクラスに追加されたメソッドはテキストブロック関連のようだ。

そういえば、JapaneseEraクラスにREIWAが加わっていた。
日本政府がもっと早く新元号を発表していればJava12に間に合ったのに…。


Java12 プレビュー版switch式

2019-03-31 16:05:52 | PG(Java)

なんと今年初の投稿^^; ドラクエビルダーズ2でいかに忙しいかということですね(爆)

2019/3/20にJava12がリリースされた。
文法的に大きなところではswitch式。ただしJava12ではまだプレビュー版であって正式版ではないので、switch文のところからはリンクを張っていない。

Stringのindentメソッドは、もしかすると使いたい場面があるかもしれない。

Stream(Collectors)のteeingメソッドも、もしかすると使う場面があるかもしれない。

Filesのmismatchメソッドはどうだろうな。Javaでファイルの内容の一致確認をしようと思ったこと無いからなぁ。
ちなみにFilesにはisSameFileというメソッドもあるけど、これはファイルのパスが同じファイルを指しているかどうか調べるものであってファイルの内容を比較するものではないので、mismatchとは役割が違う。


Java11リリース

2018-10-01 22:30:37 | PG(Java)

2018/9/25にJava11がリリースされた。9/27に閃の軌跡4が発売されて仕事が忙しかったのでちょっと遅れたけど、JavaのページにJava11を追加。

文法的な変更はラムダ式の引数にvarが使えるようになったくらいかな。大したインパクトではない^^;
むしろ色々便利なメソッドが加わっていることが大きいか。

あとJAXBが標準から削除されたので、今後使う場合はMavenリポジトリー等からダウンロードしないといけないらしい。