ひしだまの変更履歴

ひしだま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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

SQL to AsakusaFW:ビュー

2019-12-08 00:00:00 | PG(分散処理)

Asakusa Framework Advent Calendar 2019の8日目、SQLをAsakusaFWに変換するポイントについてです。

RDBのビューをAsakusaFWで使うには、2通りの方法が考えられます。
ひとつは、テーブルと同じように、RDBのビューのデータをそのまま読み込むという方法です。
もうひとつは、ビューを作るのに必要なテーブルのデータを読み込み、Asakusaアプリケーション上でビューを構築する方法です。

前者の方法は、「AsakusaFWに変換する」という意味では何もしなくてよいので、楽ですねw

後者の方法は、つまりCREATE VIEWをAsakusaFWで実現するということですが、これはINSERT-SELECTとほとんど同じです。
もし複数のAsakusaバッチがあって、前のバッチでビューを構成するテーブルのデータが更新されるのであれば、この方法を使うしかないでしょう。(でなければ、一旦RDBに反映してからビューとして読み込むことになってしまい、とても無駄な感じがします)
あるいは、そもそもビューを作るSELECTが重いのであれば、Asakusaアプリケーション上でビューを構成する方が実行速度は速くなるかもしれません。


自分では使ったことがありませんが、ビューには更新可能ビューというものがあります。
更新可能ビューに対してUPDATEを行うと、ビューを構成している元のテーブルが更新されるというものです。

さすがにこれをAsakusaFWで実現するのは大変だと思います^^;

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする