@@ -225,6 +225,45 @@ public void testMultiplyExactLongs() {
225225 }
226226 }
227227
228+ public void testMultiplyExactLongInt () {
229+ for (long a : ALL_LONG_CANDIDATES ) {
230+ for (int b : ALL_INTEGER_CANDIDATES ) {
231+ BigInteger expectedResult = BigInteger .valueOf (a ).multiply (BigInteger .valueOf (b ));
232+ boolean expectedSuccess = fitsInLong (expectedResult );
233+ try {
234+ assertEquals (a * b , Math .multiplyExact (a , b ));
235+ assertTrue (expectedSuccess );
236+ } catch (ArithmeticException e ) {
237+ assertFalse (expectedSuccess );
238+ }
239+ }
240+ }
241+ }
242+
243+ public void testMultiplyFull () {
244+ assertEquals (1L , Long .MAX_VALUE
245+ - Math .multiplyFull (Integer .MAX_VALUE , Integer .MAX_VALUE ) * 2 - 4L * Integer .MAX_VALUE );
246+ assertEquals (-1L , Long .MAX_VALUE
247+ - 2 * Math .multiplyFull (Integer .MIN_VALUE , Integer .MIN_VALUE ));
248+
249+ assertEquals (1L , hideFromCompiler (Long .MAX_VALUE )
250+ - Math .multiplyFull (Integer .MAX_VALUE , Integer .MAX_VALUE ) * 2 - 4L * Integer .MAX_VALUE );
251+ assertEquals (-1L , hideFromCompiler (Long .MAX_VALUE )
252+ - 2 * Math .multiplyFull (Integer .MIN_VALUE , Integer .MIN_VALUE ));
253+ }
254+
255+ public void testCbrt () {
256+ assertEquals (-2 , Math .cbrt (-8 ), EPS );
257+ assertEquals (Double .POSITIVE_INFINITY , Math .cbrt (Double .POSITIVE_INFINITY ), EPS );
258+ assertEquals (Double .NEGATIVE_INFINITY , Math .cbrt (Double .NEGATIVE_INFINITY ), EPS );
259+
260+ assertEquals (-2 , Math .cbrt (hideFromCompiler (-8 )), EPS );
261+ assertEquals (Double .POSITIVE_INFINITY ,
262+ Math .cbrt (hideFromCompiler (Double .POSITIVE_INFINITY )), EPS );
263+ assertEquals (Double .NEGATIVE_INFINITY ,
264+ Math .cbrt (hideFromCompiler (Double .NEGATIVE_INFINITY )), EPS );
265+ }
266+
228267 public void testNegateExact () {
229268 for (int a : ALL_INTEGER_CANDIDATES ) {
230269 BigInteger expectedResult = BigInteger .valueOf (a ).negate ();
@@ -381,6 +420,78 @@ public void testIEEEremainder() {
381420 assertTrue (Double .isNaN (Math .IEEEremainder (hideFromCompiler (Double .NaN ), Double .NaN )));
382421 }
383422
423+ public void testUlpWithFolding () {
424+ double ulpEps = 1e-50 ;
425+ assertEquals (2.220446049250313E-16 , Math .ulp (1.0 ), ulpEps );
426+ assertEquals (2.220446049250313E-16 , Math .ulp (-1.0 ), ulpEps );
427+ assertEquals (4.440892098500626E-16 , Math .ulp (2.0 ), ulpEps );
428+ assertEquals (4.440892098500626E-16 , Math .ulp (-2.0 ), ulpEps );
429+ assertEquals (4.440892098500626E-16 , Math .ulp (3.0 ), ulpEps );
430+ assertEquals (4.440892098500626E-16 , Math .ulp (-3.0 ), ulpEps );
431+ assertEquals (1.99584030953472E292 , Math .ulp (Double .MAX_VALUE ), EPS );
432+ assertEquals (1.99584030953472E292 , Math .ulp (-Double .MAX_VALUE ), EPS );
433+ assertEquals (Double .POSITIVE_INFINITY , Math .ulp (Double .NEGATIVE_INFINITY ), EPS );
434+ assertEquals (Double .POSITIVE_INFINITY , Math .ulp (Double .POSITIVE_INFINITY ), EPS );
435+ assertTrue (Double .isNaN (Math .ulp (Double .NaN )));
436+ assertEquals (Double .MIN_VALUE , Math .ulp (Double .MIN_NORMAL ), 0 );
437+ assertEquals (Double .MIN_VALUE , Math .ulp (-Double .MIN_NORMAL ), 0 );
438+ assertEquals (Double .MIN_VALUE , Math .ulp (0.0 ), 0 );
439+ assertEquals (Double .MIN_VALUE , Math .ulp (-0.0 ), 0 );
440+ assertEquals (Double .MIN_VALUE , Math .ulp (8.289046E-317 ), 0 );
441+ assertEquals (Double .MIN_VALUE , Math .ulp (-8.289046E-317 ), 0 );
442+
443+ assertEquals (1.1920929E-7f , Math .ulp (1.0f ), EPS );
444+ assertEquals (1.1920929E-7f , Math .ulp (-1.0f ), EPS );
445+ assertEquals (2.3841858E-7f , Math .ulp (2.0f ), EPS );
446+ assertEquals (2.3841858E-7f , Math .ulp (-2.0f ), EPS );
447+ assertEquals (2.3841858E-7f , Math .ulp (3.0f ), EPS );
448+ assertEquals (2.3841858E-7f , Math .ulp (-3.0f ), EPS );
449+ assertEquals (2.028241E31f , Math .ulp (Float .MAX_VALUE ), EPS );
450+ assertEquals (2.028241E31f , Math .ulp (-Float .MAX_VALUE ), EPS );
451+ assertEquals (Float .MIN_VALUE , Math .ulp (Float .MIN_VALUE ), 0 );
452+ assertEquals (Float .MIN_VALUE , Math .ulp (-Float .MIN_VALUE ), 0 );
453+ assertEquals (Float .MIN_VALUE , Math .ulp (Float .MIN_NORMAL ), 0 );
454+ assertEquals (Float .MIN_VALUE , Math .ulp (-Float .MIN_NORMAL ), 0 );
455+ assertEquals (Float .MIN_VALUE , Math .ulp (0.0f ), 0 );
456+ assertEquals (Float .MIN_VALUE , Math .ulp (-0.0f ), 0 );
457+ }
458+
459+ public void testUlp () {
460+ double ulpEps = 1e-50 ;
461+ assertEquals (2.220446049250313E-16 , Math .ulp (hideFromCompiler (1.0 )), ulpEps );
462+ assertEquals (2.220446049250313E-16 , Math .ulp (hideFromCompiler (-1.0 )), ulpEps );
463+ assertEquals (4.440892098500626E-16 , Math .ulp (hideFromCompiler (2.0 )), ulpEps );
464+ assertEquals (4.440892098500626E-16 , Math .ulp (hideFromCompiler (-2.0 )), ulpEps );
465+ assertEquals (4.440892098500626E-16 , Math .ulp (hideFromCompiler (3.0 )), ulpEps );
466+ assertEquals (4.440892098500626E-16 , Math .ulp (hideFromCompiler (-3.0 )), ulpEps );
467+ assertEquals (1.99584030953472E292 , Math .ulp (hideFromCompiler (Double .MAX_VALUE )), EPS );
468+ assertEquals (1.99584030953472E292 , Math .ulp (hideFromCompiler (-Double .MAX_VALUE )), EPS );
469+ assertEquals (Double .POSITIVE_INFINITY , Math .ulp (hideFromCompiler (Double .NEGATIVE_INFINITY )), EPS );
470+ assertEquals (Double .POSITIVE_INFINITY , Math .ulp (hideFromCompiler (Double .POSITIVE_INFINITY )), EPS );
471+ assertTrue (Double .isNaN (Math .ulp (hideFromCompiler (Double .NaN ))));
472+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (Double .MIN_NORMAL )), 0 );
473+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (-Double .MIN_NORMAL )), 0 );
474+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (0.0 )), 0 );
475+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (-0.0 )), 0 );
476+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (8.289046E-317 )), 0 );
477+ assertEquals (Double .MIN_VALUE , Math .ulp (hideFromCompiler (-8.289046E-317 )), 0 );
478+
479+ assertEquals (1.1920929E-7f , Math .ulp (hideFromCompiler (1.0f )), EPS );
480+ assertEquals (1.1920929E-7f , Math .ulp (hideFromCompiler (-1.0f )), EPS );
481+ assertEquals (2.3841858E-7f , Math .ulp (hideFromCompiler (2.0f )), EPS );
482+ assertEquals (2.3841858E-7f , Math .ulp (hideFromCompiler (-2.0f )), EPS );
483+ assertEquals (2.3841858E-7f , Math .ulp (hideFromCompiler (3.0f )), EPS );
484+ assertEquals (2.3841858E-7f , Math .ulp (hideFromCompiler (-3.0f )), EPS );
485+ assertEquals (2.028241E31f , Math .ulp (hideFromCompiler (Float .MAX_VALUE )), EPS );
486+ assertEquals (2.028241E31f , Math .ulp (hideFromCompiler (-Float .MAX_VALUE )), EPS );
487+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (Float .MIN_VALUE )), 0 );
488+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (-Float .MIN_VALUE )), 0 );
489+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (Float .MIN_NORMAL )), 0 );
490+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (-Float .MIN_NORMAL )), 0 );
491+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (0.0f )), 0 );
492+ assertEquals (Float .MIN_VALUE , Math .ulp (hideFromCompiler (-0.0f )), 0 );
493+ }
494+
384495 public void testHypot () {
385496 assertEquals (5.0 , Math .hypot (3.0 , 4.0 ), EPS );
386497 assertEquals (Double .POSITIVE_INFINITY , Math .hypot (1 , Double .NEGATIVE_INFINITY ));
0 commit comments