8240632: Note differences between IEEE 754-2019 math lib special cases and java.lang.Math

Reviewed-by: bpb
This commit is contained in:
Joe Darcy 2021-02-08 21:50:55 +00:00
parent ace8f94616
commit 2fd8ed024b
5 changed files with 264 additions and 21 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -74,6 +74,15 @@ import jdk.internal.vm.annotation.IntrinsicCandidate;
* occurs only with a specific minimum or maximum value and
* should be checked against the minimum or maximum as appropriate.
*
* <h2><a id=Ieee754RecommendedOps>IEEE 754 Recommended
* Operations</a></h2>
*
* The {@link java.lang.Math Math} class discusses how the shared
* quality of implementation criteria for selected {@code Math} and
* {@code StrictMath} methods <a
* href="Math.html#Ieee754RecommendedOps">relate to the IEEE 754
* recommended operations</a>.
*
* @author Joseph D. Darcy
* @since 1.3
*/
@ -126,7 +135,9 @@ public final class StrictMath {
/**
* Returns the trigonometric cosine of an angle. Special cases:
* <ul><li>If the argument is NaN or an infinity, then the
* result is NaN.</ul>
* result is NaN.
* <li>If the argument is zero, then the result is {@code 1.0}.
* </ul>
*
* @param a an angle, in radians.
* @return the cosine of the argument.
@ -162,7 +173,9 @@ public final class StrictMath {
* Returns the arc cosine of a value; the returned angle is in the
* range 0.0 through <i>pi</i>. Special case:
* <ul><li>If the argument is NaN or its absolute value is greater
* than 1, then the result is NaN.</ul>
* than 1, then the result is NaN.
* <li>If the argument is {@code 1.0}, the result is positive zero.
* </ul>
*
* @param a the value whose arc cosine is to be returned.
* @return the arc cosine of the argument.
@ -174,7 +187,11 @@ public final class StrictMath {
* range -<i>pi</i>/2 through <i>pi</i>/2. Special cases:
* <ul><li>If the argument is NaN, then the result is NaN.
* <li>If the argument is zero, then the result is a zero with the
* same sign as the argument.</ul>
* same sign as the argument.
* <li>If the argument is {@linkplain Double#isInfinite infinite},
* then the result is the closest value to <i>pi</i>/2 with the
* same sign as the input.
* </ul>
*
* @param a the value whose arc tangent is to be returned.
* @return the arc tangent of the argument.
@ -220,7 +237,9 @@ public final class StrictMath {
* <li>If the argument is positive infinity, then the result is
* positive infinity.
* <li>If the argument is negative infinity, then the result is
* positive zero.</ul>
* positive zero.
* <li>If the argument is zero, then the result is {@code 1.0}.
* </ul>
*
* @param a the exponent to raise <i>e</i> to.
* @return the value <i>e</i><sup>{@code a}</sup>,
@ -238,7 +257,10 @@ public final class StrictMath {
* <li>If the argument is positive infinity, then the result is
* positive infinity.
* <li>If the argument is positive zero or negative zero, then the
* result is negative infinity.</ul>
* result is negative infinity.
* <li>If the argument is {@code 1.0}, then the result is positive
* zero.
* </ul>
*
* @param a a value
* @return the value ln&nbsp;{@code a}, the natural logarithm of
@ -256,8 +278,10 @@ public final class StrictMath {
* positive infinity.
* <li>If the argument is positive zero or negative zero, then the
* result is negative infinity.
* <li> If the argument is equal to 10<sup><i>n</i></sup> for
* integer <i>n</i>, then the result is <i>n</i>.
* <li>If the argument is equal to 10<sup><i>n</i></sup> for
* integer <i>n</i>, then the result is <i>n</i>. In particular,
* if the argument is {@code 1.0} (10<sup>0</sup>), then the
* result is positive zero.
* </ul>
*
* @param a a value
@ -517,6 +541,15 @@ public final class StrictMath {
* <li>If both arguments are negative infinity, then the result is the
* {@code double} value closest to -3*<i>pi</i>/4.</ul>
*
* @apiNote
* For <i>y</i> with a positive sign and finite nonzero
* <i>x</i>, the exact mathematical value of {@code atan2} is
* equal to:
* <ul>
* <li>If <i>x</i> {@literal >} 0, atan(abs(<i>y</i>/<i>x</i>))
* <li>If <i>x</i> {@literal <} 0, &pi; - atan(abs(<i>y</i>/<i>x</i>))
* </ul>
*
* @param y the ordinate coordinate
* @param x the abscissa coordinate
* @return the <i>theta</i> component of the point
@ -642,6 +675,16 @@ public final class StrictMath {
* method if and only if the result of applying the method to the
* value is equal to the value.)
*
* @apiNote
* The special cases definitions of this method differ from the
* special case definitions of the IEEE 754 recommended {@code
* pow} operation for &plusmn;{@code 1.0} raised to an infinite
* power. This method treats such cases as indeterminate and
* specifies a NaN is returned. The IEEE 754 specification treats
* the infinite power as a large integer (large-magnitude
* floating-point numbers are numerically integers, specifically
* even integers) and therefore specifies {@code 1.0} be returned.
*
* @param a base.
* @param b the exponent.
* @return the value {@code a}<sup>{@code b}</sup>.
@ -1681,6 +1724,7 @@ public final class StrictMath {
* <li> If either argument is NaN and neither argument is infinite,
* then the result is NaN.
*
* <li> If both arguments are zero, the result is positive zero.
* </ul>
*
* @param x a value