<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div>Ahhh,<br></div><div>so i'm the one to blame, here.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>For whatever reason, i get the representational equivalence wrong. <br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Thanks for the explanation Joe, i stand corrected.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"joe darcy" <joe.darcy@oracle.com><br><b>To: </b>"Remi Forax" <forax@univ-mlv.fr>, "Angelos Bimpoudis" <angelos.bimpoudis@oracle.com><br><b>Cc: </b>"amber-dev" <amber-dev@openjdk.org><br><b>Sent: </b>Thursday, January 26, 2023 11:04:20 PM<br><b>Subject: </b>Re: Draft JEP on Primitive types in patterns, instanceof, and switch<br></blockquote></div><div><style style="display:none;">P {margin-top:0;margin-bottom:0;}</style></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><p>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.<br>
</p>
<p><br>
</p>
<p>As mentioned in the draft JEP, the matching for floating-point
values should use representational equivalence, quoting from
java.lang.Double:</p>
<p><br>
</p>
<p>
</p><blockquote>The two floating-point values represent
the same IEEE 754 <i>datum</i>. In particular, for <a href="https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/Double.html#isFinite(double)" target="_blank">finite</a>
values, the sign, <a href="https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/Math.html#getExponent(double)" target="_blank">exponent</a>,
and significand components of the floating-point values are the
same. Under this relation:
<ul>
<li> <code>+0.0</code> and <code>-0.0</code> are
distinguished from each other. </li>
<li> every bit pattern encoding a NaN is considered equivalent
to each other </li>
<li> positive infinity is equivalent to positive infinity;
negative infinity is equivalent to negative infinity. </li>
</ul>
Expressions implementing this equivalence relation include:
<ul>
<li><code>Double.doubleToLongBits(a) ==
Double.doubleToLongBits(b)</code> </li>
<li><code>Double.valueOf(a).equals(Double.valueOf(b))</code> </li>
<li><code>Double.compare(a, b) == 0</code> </li>
</ul>
Note that representation equivalence is often an appropriate
notion of equivalence to test the behavior of <a href="https://download.java.net/java/early_access/jdk21/docs/api/java.base/java/lang/StrictMath.html" title="class in java.lang" target="_blank">math libraries</a>. </blockquote>
<br>
<p></p>
<p>So, under this approach you could have <br>
</p>
<p><br>
</p>
<p>switch(d) {</p>
<p> case -0.0 -> ...<br>
case +0.0 -> ...<br>
case NaN -> ... // Handles all NaNs<br>
...<br>
</p>
<p>}<br>
</p>
<p><br>
</p>
<p>Operationally, this could be desugared to switching over a long
by first mapping the double to long via doubleToLongBits (and
*not* raw-long-bits).</p>
<p><br>
</p>
<p>HTH,</p>
<p><br>
</p>
<p>-Joe<br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">On 1/26/2023 5:15 AM, Remi Forax wrote:<br>
</div>
<blockquote cite="mid:1882463428.5806520.1674738916735.JavaMail.zimbra@u-pem.fr">
<div style="font-family: arial, helvetica, sans-serif; font-size:
12pt; color: #000000">
<div><br>
</div>
<div><br>
</div>
<hr id="zwchr">
<div>
<blockquote style="border-left:2px solid
#1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From:
</b>"Angelos Bimpoudis" <a class="moz-txt-link-rfc2396E" href="mailto:angelos.bimpoudis@oracle.com" target="_blank"><angelos.bimpoudis@oracle.com></a><br>
<b>To: </b>"amber-dev" <a class="moz-txt-link-rfc2396E" href="mailto:amber-dev@openjdk.org" target="_blank"><amber-dev@openjdk.org></a><br>
<b>Sent: </b>Thursday, January 26, 2023 10:48:47 AM<br>
<b>Subject: </b>Draft JEP on Primitive types in patterns,
instanceof, and switch<br>
</blockquote>
</div>
<div>
</div>
<div>
<blockquote style="border-left:2px solid
#1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;">
<div style="font-family: "Segoe UI", "Segoe
UI ", "Helvetica Neue", sans-serif;
font-size: 11pt; color: rgb(0, 0, 0); background-color:
rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<span style="color: rgb(0, 0, 0); font-family: "Segoe
UI", "Segoe UI ", "Helvetica
Neue", sans-serif; font-size: 11pt;">Hello all,</span></div>
<div style="font-family: "Segoe UI", "Segoe
UI ", "Helvetica Neue", sans-serif;
font-size: 11pt; color: rgb(0, 0, 0); background-color:
rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<span style="color: rgb(0, 0, 0); font-family: "Segoe
UI", "Segoe UI ", "Helvetica
Neue", sans-serif; font-size: 11pt;"><br>
</span></div>
<div style="font-family: "Segoe UI", "Segoe
UI ", "Helvetica Neue", sans-serif;
font-size: 11pt; color: rgb(0, 0, 0); background-color:
rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<span style="color: rgb(0, 0, 0); font-family: "Segoe
UI", "Segoe UI ", "Helvetica
Neue", sans-serif; font-size: 11pt;">I would like
to share this draft JEP with you about primitive types
in patterns, instanceof, and switch:</span></div>
<div style="font-family: "Segoe UI", "Segoe
UI ", "Helvetica Neue", sans-serif;
font-size: 11pt; color: rgb(0, 0, 0); background-color:
rgb(255, 255, 255);" class="elementToProof ContentPasted0">
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0"><a class="moz-txt-link-freetext" href="https://openjdk.org/jeps/8288476" target="_blank">https://openjdk.org/jeps/8288476</a><br data-mce-bogus="1"></div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">"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."</div>
<div><br class="ContentPasted0">
</div>
<div class="ContentPasted0">Comments very much welcomed!</div>
<div class="ContentPasted0"><br>
</div>
<div class="ContentPasted0">Many thanks,</div>
<div class="ContentPasted0">Angelos</div>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>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.<br>
</div>
<div><br>
</div>
<div>Allowing switching on double and float constants is just
wrong.</div>
<div>Rust is actually trying to remove that feature<br>
</div>
<div> <a href="https://github.com/rust-lang/rust/issues/41255" class="moz-txt-link-freetext" target="_blank">https://github.com/rust-lang/rust/issues/41255</a><br>
</div>
<div><br>
</div>
<div>I see no point to make the same mistake.<br>
</div>
<div><br>
</div>
<div>Otherwise, the rest is fine.<br>
</div>
<div><br>
</div>
<div>Rémi<br>
</div>
<div><br>
</div>
</div>
</div>
</blockquote><br></blockquote></div></div></body></html>