Quality Outreach Heads-up – JDK 19 – Double.toString() and Float.toString() changes

原文はこちら。
The original article was written by David Delabassee (DevRel – Java Platform Group at Oracle).
https://inside.java/2022/09/23/quality-heads-up/

OpenJDK Quality Groupは、リリースの全体的な品質向上の手段としてOpenJDK Early Accessビルドを使ってのFOSSプロジェクトのテストを推進しています。

Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach

このHeads upは、関係するプロジェクトに送られる定期的なコミュニケーションの一部です。

JDK 19 GA, JDK 20 EAb16, and some heads-up!
https://mail.openjdk.org/pipermail/quality-discuss/2022-September/001096.html

このプログラムの詳細と参加方法については、上記wikiをご覧ください。

JDK 19 – Double.toString() and Float.toString() changes

Java 19 で、Double.toString(double)Float.toString(float) に影響する不具合が修正されました。

[JDK-4511638] Double.toString(double) sometimes produces incorrect results
https://bugs.openjdk.org/browse/JDK-4511638

Javadoc によると、Double.toString(double)は、このdouble値と隣接するdouble値を一意に区別できる、できるだけ小さい桁数の文字列を生成しなければならないのですが、多くのdouble値ではそうではありませんでした。例えば、1e239.999999999999999E22は同じdouble値なのですが、1e23Double.toString(double)に渡すと"9.999999999999999E22"を返していました。

仕様がアップデートされ、それに伴い実装も更新されました。その結果、JDK19から、生成される文字列のいくつかは、以前のリリースで生成されたものよりも短くなりました。たとえば、JDK 19でこのメソッドに1e23を渡すと、以前のJDK リリースでは"9.999999999999999E22"でしたが、"1.0E23"を返します。JDK 19では、9.999999999999999E22をこのメソッドに渡しても、同じdouble値であるため1.0E23を返すことに注意しましょう。仕様の更新に合わせて、doubleやfloatの多くの文字列表現が変更されています。

$ jshell
|  Welcome to JShell -- Version 19
|  For an introduction type: /help intro

jshell> double v1 = 9.999999999999999E22;
v1 ==> 1.0E23

jshell> double v2=1e23;
v2 ==> 1.0E23

jshell> Double.toString(v1)
$3 ==> "1.0E23"

jshell> Double.toString(v2)
$4 ==> "1.0E23"

More information

詳細は、リリースノートおよび修正そのものをご覧ください。

[JDK-8291475] Release Note: Double.toString(double) and Float.toString(float) may Return Slightly Different Results
https://bugs.openjdk.org/browse/JDK-8291475
[JDK-4511638] Double.toString(double) sometimes produces incorrect results
https://bugs.openjdk.org/browse/JDK-4511638

Joe Darcyの素晴らしいセッション動画 “Floating-Point Arithmatic : What Every Java Programmer Should Know!” で浮動小数点演算について学ぶのもよいでしょう。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中