Support for primitive types in instanceof and type patterns
Brian Goetz
brian.goetz at oracle.com
Wed Nov 16 15:20:38 UTC 2022
Indeed. During the early explorations for this feature we got fooled by
values for which casting from T to U lost precision, but the
corresponding cast back from U to T was also imprecise, and so the
round-trip T -> U -> T preserved the input value. We scratched our
heads over this for a while.
On 11/16/2022 10:15 AM, Dan Heidinga wrote:
> It's good to hear that you and others are thinking through the details
> on how float/doubles will work.
>
> I still have some concern with user-intuition when writing pattern
> matching code over floating point values if users base their intuition
> on their experience with widening casts to float. There's a great
> sample program (JLS Example 5.1.2-1) which shows the loss of precision
> when casting a large int to a float which I would try to express with
> pattern matching roughly as:
>
> record FloatBox(float f) {}
> int big = 1234567890;
> FloatBox box = new FloatBox(big);
> if (box instanceof FloatBox(int i)) {
> // pattern won't match here
> }
>
> I think users would be surprised reading the code that the pattern
> doesn't match because converting back to an int would lose precession.
>
> The equivalent non-pattern code would be pretty clear that it accepted
> the loss of precession:
>
> if (box instanceof FLoatBox) {
> int i = (int)box.f();
> ....
> }
>
> Users will find it confusing when the pattern seems to match
> "sometimes" though this is likely due to existing confusion related to
> floating types. Maybe expanding on the expected implementation will
> make it easier to build a mental model for when the match will succeed?
>
> --Dan
>
>
> On Tue, Nov 15, 2022 at 6:13 PM Joseph D. Darcy <joe.darcy at oracle.com>
> wrote:
>
> On 11/15/2022 12:13 PM, Brian Goetz wrote:
> >
> >
> > On 11/15/2022 2:55 PM, Dan Heidinga wrote:
> >> Hi Angelos,
> >>
> >> The overall direction and writeup for this looks good to me. I
> think
> >> we need to be more specific about how doubles & floats fit into
> this
> >> though as they are perpetual source of special cases.
> >
> > Indeed, floating point is the gift that keeps on giving.
> >
> > Joe recently did some nice work in the spec of Float and Double,
> > outlining the various different ways in which floats can be
> compared.
> > This allows language features like pattern matching, casting, and
> > switch to appeal to "compared by FooBar comparison", rather than
> > spelling it out for each use.
> >
> >
> FYI, the new text in question is:
>
> https://download.java.net/java/early_access/jdk20/docs/api/java.base/java/lang/Double.html#fpNumericalEq
> <https://urldefense.com/v3/__https://download.java.net/java/early_access/jdk20/docs/api/java.base/java/lang/Double.html*fpNumericalEq__;Iw!!ACWV5N9M2RV99hQ!NLeYfZTwyKuJa79r6BKK7vCpK18EfV6UFYQATED31R-rgD9GThj4b5Apwa-MjRhTkfthC6sXdBLheOEVZLA$>
>
> For the cases in the draft JEP, there have been separate discussions
> working through the details. Putting aside how it might be
> implemented,
> for the
>
> floating-point type -> integral type
>
> cases, conceptually if the same real number can be presented in the
> floating-point type and the integral type, then the conversion is
> exact.
> (While floating-point values are often thought of as "fuzzy," each
> finite floating-point value represents some particular real number.
> Finite binary floating-point values are sums of the powers of 2 where
> the exponent difference of the powers is bounded by the significand
> width of the floating-point format in question.) The main special
> case
> is how conversion of -0.0 to an integral type is defined for
> purposes of
> instanceof. The desired double -> float behavior can be inferred from
> IEEE 754 concepts.
>
> HTH,
>
> -Joe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-observers/attachments/20221116/477081ea/attachment.htm>
More information about the amber-spec-observers
mailing list