Draft JEP on Primitive types in patterns, instanceof, and switch

Brian Goetz brian.goetz at oracle.com
Thu Jan 26 23:50:18 UTC 2023


Floating point is tricky!

On 1/26/2023 5:25 PM, forax at univ-mlv.fr wrote:
> Ahhh,
> so i'm the one to blame, here.
>
> For whatever reason, i get the representational equivalence wrong.
>
> Thanks for the explanation Joe, i stand corrected.
>
> Rémi
>
> ------------------------------------------------------------------------
>
>     *From: *"joe darcy" <joe.darcy at oracle.com>
>     *To: *"Remi Forax" <forax at univ-mlv.fr>, "Angelos Bimpoudis"
>     <angelos.bimpoudis at oracle.com>
>     *Cc: *"amber-dev" <amber-dev at openjdk.org>
>     *Sent: *Thursday, January 26, 2023 11:04:20 PM
>     *Subject: *Re: Draft JEP on Primitive types in patterns,
>     instanceof, and switch
>
>     Switching on floating-point values is perfectly well-defined.
>     Despite common presentation to the contrary, floating-point
>     numbers are not "fuzzy," they are a precisely-defined subset of
>     real numbers, with some notable special cases.
>
>
>     As mentioned in the draft JEP, the matching for floating-point
>     values should use representational equivalence, quoting from
>     java.lang.Double:
>
>
>         The two floating-point values represent the same IEEE 754
>         /datum/. In particular, for finite
>         <https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/Double.html#isFinite(double)>
>         values, the sign, exponent
>         <https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/Math.html#getExponent(double)>,
>         and significand components of the floating-point values are
>         the same. Under this relation:
>
>           * |+0.0| and |-0.0| are distinguished from each other.
>           * every bit pattern encoding a NaN is considered equivalent
>             to each other
>           * positive infinity is equivalent to positive infinity;
>             negative infinity is equivalent to negative infinity.
>
>         Expressions implementing this equivalence relation include:
>
>           * |Double.doubleToLongBits(a) == Double.doubleToLongBits(b)|
>           * |Double.valueOf(a).equals(Double.valueOf(b))|
>           * |Double.compare(a, b) == 0|
>
>         Note that representation equivalence is often an appropriate
>         notion of equivalence to test the behavior of math libraries
>         <https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/StrictMath.html>.
>
>
>
>     So, under this approach you could have
>
>
>     switch(d) {
>
>         case -0.0 -> ...
>         case +0.0 -> ...
>         case NaN -> ... // Handles all NaNs
>       ...
>
>     }
>
>
>     Operationally, this could be desugared to switching over a long by
>     first mapping the double to long via doubleToLongBits (and *not*
>     raw-long-bits).
>
>
>     HTH,
>
>
>     -Joe
>
>
>     On 1/26/2023 5:15 AM, Remi Forax wrote:
>
>
>
>         ------------------------------------------------------------------------
>
>             *From: *"Angelos Bimpoudis" <angelos.bimpoudis at oracle.com>
>             *To: *"amber-dev" <amber-dev at openjdk.org>
>             *Sent: *Thursday, January 26, 2023 10:48:47 AM
>             *Subject: *Draft JEP on Primitive types in patterns,
>             instanceof, and switch
>
>             Hello all,
>
>             I would like to share this draft JEP with you about
>             primitive types in patterns, instanceof, and switch:
>
>             https://openjdk.org/jeps/8288476
>
>             "Enhance pattern matching by allowing primitive types to
>             appear anywhere in patterns. Extend instanceof to support
>             primitive types, and extend switch to allow primitive
>             constants as case labels."
>
>             Comments very much welcomed!
>
>             Many thanks,
>             Angelos
>
>
>         I still think that the semantics proposed for pattern matching
>         on primitive types is useless complexity with the perverse
>         side effect of normalizing the usage of "default" in pattern
>         matching (too many examples of this JEP are using "default")
>         but we already discussed that.
>
>         Allowing switching on double and float constants is just wrong.
>         Rust is actually trying to remove that feature
>         https://github.com/rust-lang/rust/issues/41255
>
>         I see no point to make the same mistake.
>
>         Otherwise, the rest is fine.
>
>         Rémi
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20230126/1c690550/attachment.htm>


More information about the amber-dev mailing list