1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.luni.tests.java.lang; 19 20 import static org.apache.harmony.luni.tests.java.lang.MathTest.COPYSIGN_DD_CASES; 21 import static org.apache.harmony.luni.tests.java.lang.MathTest.COPYSIGN_FF_CASES; 22 import static org.apache.harmony.luni.tests.java.lang.MathTest.GETEXPONENT_D_CASES; 23 import static org.apache.harmony.luni.tests.java.lang.MathTest.GETEXPONENT_D_RESULTS; 24 import static org.apache.harmony.luni.tests.java.lang.MathTest.GETEXPONENT_F_CASES; 25 import static org.apache.harmony.luni.tests.java.lang.MathTest.GETEXPONENT_F_RESULTS; 26 import static org.apache.harmony.luni.tests.java.lang.MathTest.NEXTAFTER_DD_START_CASES; 27 import static org.apache.harmony.luni.tests.java.lang.MathTest.NEXTAFTER_DD_FD_DIRECTION_CASES; 28 import static org.apache.harmony.luni.tests.java.lang.MathTest.NEXTAFTER_FD_START_CASES; 29 30 public class StrictMathTest extends junit.framework.TestCase { 31 32 double HYP = StrictMath.sqrt(2.0); 33 34 double OPP = 1.0; 35 36 double ADJ = 1.0; 37 38 /* Required to make previous preprocessor flags work - do not remove */ 39 int unused = 0; 40 41 /** 42 * @tests java.lang.StrictMath#abs(double) 43 */ 44 public void test_absD() { 45 // Test for method double java.lang.StrictMath.abs(double) 46 47 assertTrue("Incorrect double abs value", 48 (StrictMath.abs(-1908.8976) == 1908.8976)); 49 assertTrue("Incorrect double abs value", 50 (StrictMath.abs(1908.8976) == 1908.8976)); 51 } 52 53 /** 54 * @tests java.lang.StrictMath#abs(float) 55 */ 56 public void test_absF() { 57 // Test for method float java.lang.StrictMath.abs(float) 58 assertTrue("Incorrect float abs value", 59 (StrictMath.abs(-1908.8976f) == 1908.8976f)); 60 assertTrue("Incorrect float abs value", 61 (StrictMath.abs(1908.8976f) == 1908.8976f)); 62 } 63 64 /** 65 * @tests java.lang.StrictMath#abs(int) 66 */ 67 public void test_absI() { 68 // Test for method int java.lang.StrictMath.abs(int) 69 assertTrue("Incorrect int abs value", 70 (StrictMath.abs(-1908897) == 1908897)); 71 assertTrue("Incorrect int abs value", 72 (StrictMath.abs(1908897) == 1908897)); 73 } 74 75 /** 76 * @tests java.lang.StrictMath#abs(long) 77 */ 78 public void test_absJ() { 79 // Test for method long java.lang.StrictMath.abs(long) 80 assertTrue("Incorrect long abs value", (StrictMath 81 .abs(-19088976000089L) == 19088976000089L)); 82 assertTrue("Incorrect long abs value", 83 (StrictMath.abs(19088976000089L) == 19088976000089L)); 84 } 85 86 /** 87 * @tests java.lang.StrictMath#acos(double) 88 */ 89 public void test_acosD() { 90 // Test for method double java.lang.StrictMath.acos(double) 91 assertTrue("Returned incorrect arc cosine", StrictMath.cos(StrictMath 92 .acos(ADJ / HYP)) == ADJ / HYP); 93 } 94 95 /** 96 * @tests java.lang.StrictMath#asin(double) 97 */ 98 public void test_asinD() { 99 // Test for method double java.lang.StrictMath.asin(double) 100 assertTrue("Returned incorrect arc sine", StrictMath.sin(StrictMath 101 .asin(OPP / HYP)) == OPP / HYP); 102 } 103 104 /** 105 * @tests java.lang.StrictMath#atan(double) 106 */ 107 public void test_atanD() { 108 // Test for method double java.lang.StrictMath.atan(double) 109 double answer = StrictMath.tan(StrictMath.atan(1.0)); 110 assertTrue("Returned incorrect arc tangent: " + answer, answer <= 1.0 111 && answer >= 9.9999999999999983E-1); 112 } 113 114 /** 115 * @tests java.lang.StrictMath#atan2(double, double) 116 */ 117 public void test_atan2DD() { 118 // Test for method double java.lang.StrictMath.atan2(double, double) 119 double answer = StrictMath.atan(StrictMath.tan(1.0)); 120 assertTrue("Returned incorrect arc tangent: " + answer, answer <= 1.0 121 && answer >= 9.9999999999999983E-1); 122 } 123 124 /** 125 * @tests java.lang.StrictMath#cbrt(double) 126 */ 127 @SuppressWarnings("boxing") 128 public void test_cbrt_D() { 129 // Test for special situations 130 assertTrue("Should return Double.NaN", Double.isNaN(StrictMath 131 .cbrt(Double.NaN))); 132 assertEquals("Should return Double.POSITIVE_INFINITY", 133 Double.POSITIVE_INFINITY, StrictMath 134 .cbrt(Double.POSITIVE_INFINITY)); 135 assertEquals("Should return Double.NEGATIVE_INFINITY", 136 Double.NEGATIVE_INFINITY, StrictMath 137 .cbrt(Double.NEGATIVE_INFINITY)); 138 assertEquals(Double.doubleToLongBits(0.0), Double 139 .doubleToLongBits(StrictMath.cbrt(0.0))); 140 assertEquals(Double.doubleToLongBits(+0.0), Double 141 .doubleToLongBits(StrictMath.cbrt(+0.0))); 142 assertEquals(Double.doubleToLongBits(-0.0), Double 143 .doubleToLongBits(StrictMath.cbrt(-0.0))); 144 145 assertEquals("Should return 3.0", 3.0, StrictMath.cbrt(27.0)); 146 assertEquals("Should return 23.111993172558684", 23.111993172558684, 147 StrictMath.cbrt(12345.6)); 148 assertEquals("Should return 5.643803094122362E102", 149 5.643803094122362E102, StrictMath.cbrt(Double.MAX_VALUE)); 150 assertEquals("Should return 0.01", 0.01, StrictMath.cbrt(0.000001)); 151 152 assertEquals("Should return -3.0", -3.0, StrictMath.cbrt(-27.0)); 153 assertEquals("Should return -23.111993172558684", -23.111993172558684, 154 StrictMath.cbrt(-12345.6)); 155 assertEquals("Should return 1.7031839360032603E-108", 156 1.7031839360032603E-108, StrictMath.cbrt(Double.MIN_VALUE)); 157 assertEquals("Should return -0.01", -0.01, StrictMath.cbrt(-0.000001)); 158 159 try{ 160 StrictMath.cbrt((Double)null); 161 fail("Should throw NullPointerException"); 162 }catch(NullPointerException e){ 163 //expected 164 } 165 } 166 167 /** 168 * @tests java.lang.StrictMath#ceil(double) 169 */ 170 public void test_ceilD() { 171 // Test for method double java.lang.StrictMath.ceil(double) 172 assertEquals("Incorrect ceiling for double", 173 79, StrictMath.ceil(78.89), 0.0); 174 assertEquals("Incorrect ceiling for double", 175 -78, StrictMath.ceil(-78.89), 0.0); 176 } 177 178 /** 179 * @tests {@link java.lang.StrictMath#copySign(double, double)} 180 * @since 1.6 181 */ 182 @SuppressWarnings("boxing") 183 public void test_copySign_DD() { 184 for (int i = 0; i < COPYSIGN_DD_CASES.length; i++) { 185 final double magnitude = COPYSIGN_DD_CASES[i]; 186 final long absMagnitudeBits = Double.doubleToLongBits(StrictMath 187 .abs(magnitude)); 188 final long negMagnitudeBits = Double.doubleToLongBits(-StrictMath 189 .abs(magnitude)); 190 191 // cases for NaN 192 assertEquals("If the sign is NaN, the result should be positive.", 193 absMagnitudeBits, Double.doubleToLongBits(StrictMath 194 .copySign(magnitude, Double.NaN))); 195 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 196 .copySign(Double.NaN, magnitude))); 197 198 for (int j = 0; j < COPYSIGN_DD_CASES.length; j++) { 199 final double sign = COPYSIGN_DD_CASES[j]; 200 final long resultBits = Double.doubleToLongBits(StrictMath 201 .copySign(magnitude, sign)); 202 203 if (sign > 0 || Double.valueOf(+0.0).equals(sign) 204 || Double.valueOf(0.0).equals(sign)) { 205 assertEquals( 206 "If the sign is positive, the result should be positive.", 207 absMagnitudeBits, resultBits); 208 } 209 if (sign < 0 || Double.valueOf(-0.0).equals(sign)) { 210 assertEquals( 211 "If the sign is negative, the result should be negative.", 212 negMagnitudeBits, resultBits); 213 } 214 } 215 } 216 217 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 218 .copySign(Double.NaN, Double.NaN))); 219 220 try { 221 StrictMath.copySign((Double) null, 2.3); 222 fail("Should throw NullPointerException"); 223 } catch (NullPointerException e) { 224 // Expected 225 } 226 try { 227 StrictMath.copySign(2.3, (Double) null); 228 fail("Should throw NullPointerException"); 229 } catch (NullPointerException e) { 230 // Expected 231 } 232 try { 233 StrictMath.copySign((Double) null, (Double) null); 234 fail("Should throw NullPointerException"); 235 } catch (NullPointerException e) { 236 // Expected 237 } 238 239 double d = Double.longBitsToDouble(0xfff8000000000000L); 240 assertEquals(1.0, StrictMath.copySign(1.0, d), 0d); 241 } 242 243 /** 244 * @tests {@link java.lang.StrictMath#copySign(float, float)} 245 * @since 1.6 246 */ 247 @SuppressWarnings("boxing") 248 public void test_copySign_FF() { 249 for (int i = 0; i < COPYSIGN_FF_CASES.length; i++) { 250 final float magnitude = COPYSIGN_FF_CASES[i]; 251 final int absMagnitudeBits = Float.floatToIntBits(StrictMath 252 .abs(magnitude)); 253 final int negMagnitudeBits = Float.floatToIntBits(-StrictMath 254 .abs(magnitude)); 255 256 // cases for NaN 257 assertEquals("If the sign is NaN, the result should be positive.", 258 absMagnitudeBits, Float.floatToIntBits(StrictMath.copySign( 259 magnitude, Float.NaN))); 260 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 261 .copySign(Float.NaN, magnitude))); 262 263 for (int j = 0; j < COPYSIGN_FF_CASES.length; j++) { 264 final float sign = COPYSIGN_FF_CASES[j]; 265 final int resultBits = Float.floatToIntBits(StrictMath 266 .copySign(magnitude, sign)); 267 if (sign > 0 || Float.valueOf(+0.0f).equals(sign) 268 || Float.valueOf(0.0f).equals(sign)) { 269 assertEquals( 270 "If the sign is positive, the result should be positive.", 271 absMagnitudeBits, resultBits); 272 } 273 if (sign < 0 || Float.valueOf(-0.0f).equals(sign)) { 274 assertEquals( 275 "If the sign is negative, the result should be negative.", 276 negMagnitudeBits, resultBits); 277 } 278 } 279 } 280 281 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 282 .copySign(Float.NaN, Float.NaN))); 283 284 try { 285 StrictMath.copySign((Float) null, 2.3f); 286 fail("Should throw NullPointerException"); 287 } catch (NullPointerException e) { 288 // Expected 289 } 290 try { 291 StrictMath.copySign(2.3f, (Float) null); 292 fail("Should throw NullPointerException"); 293 } catch (NullPointerException e) { 294 // Expected 295 } 296 try { 297 StrictMath.copySign((Float) null, (Float) null); 298 fail("Should throw NullPointerException"); 299 } catch (NullPointerException e) { 300 // Expected 301 } 302 303 float f = Float.intBitsToFloat(0xffc00000); 304 assertEquals(1.0f, StrictMath.copySign(1.0f, f), 0f); 305 } 306 307 /** 308 * @tests java.lang.StrictMath#cos(double) 309 */ 310 public void test_cosD() { 311 // Test for method double java.lang.StrictMath.cos(double) 312 313 assertTrue("Returned incorrect cosine", StrictMath.cos(StrictMath 314 .acos(ADJ / HYP)) == ADJ / HYP); 315 } 316 317 /** 318 * @tests java.lang.StrictMath#cosh(double) 319 */ 320 @SuppressWarnings("boxing") 321 public void test_cosh_D() { 322 // Test for special situations 323 assertTrue("Should return NaN", Double.isNaN(StrictMath 324 .cosh(Double.NaN))); 325 assertEquals("Should return POSITIVE_INFINITY", 326 Double.POSITIVE_INFINITY, StrictMath 327 .cosh(Double.POSITIVE_INFINITY)); 328 assertEquals("Should return POSITIVE_INFINITY", 329 Double.POSITIVE_INFINITY, StrictMath 330 .cosh(Double.NEGATIVE_INFINITY)); 331 assertEquals("Should return 1.0", 1.0, StrictMath.cosh(+0.0)); 332 assertEquals("Should return 1.0", 1.0, StrictMath.cosh(-0.0)); 333 334 assertEquals("Should return POSITIVE_INFINITY", 335 Double.POSITIVE_INFINITY, StrictMath.cosh(1234.56)); 336 assertEquals("Should return POSITIVE_INFINITY", 337 Double.POSITIVE_INFINITY, StrictMath.cosh(-1234.56)); 338 assertEquals("Should return 1.0000000000005", 1.0000000000005, 339 StrictMath.cosh(0.000001)); 340 assertEquals("Should return 1.0000000000005", 1.0000000000005, 341 StrictMath.cosh(-0.000001)); 342 assertEquals("Should return 5.212214351945598", 5.212214351945598, 343 StrictMath.cosh(2.33482)); 344 345 assertEquals("Should return POSITIVE_INFINITY", 346 Double.POSITIVE_INFINITY, StrictMath.cosh(Double.MAX_VALUE)); 347 assertEquals("Should return 1.0", 1.0, StrictMath 348 .cosh(Double.MIN_VALUE)); 349 } 350 351 /** 352 * @tests java.lang.StrictMath#exp(double) 353 */ 354 public void test_expD() { 355 // Test for method double java.lang.StrictMath.exp(double) 356 assertTrue("Incorrect answer returned for simple power", StrictMath 357 .abs(StrictMath.exp(4D) - StrictMath.E * StrictMath.E 358 * StrictMath.E * StrictMath.E) < 0.1D); 359 assertTrue("Incorrect answer returned for larger power", StrictMath 360 .log(StrictMath.abs(StrictMath.exp(5.5D)) - 5.5D) < 10.0D); 361 } 362 363 /** 364 * @tests java.lang.StrictMath#expm1(double) 365 */ 366 @SuppressWarnings("boxing") 367 public void test_expm1_D() { 368 //Test for special cases 369 assertTrue("Should return NaN", Double.isNaN(StrictMath.expm1(Double.NaN))); 370 assertEquals("Should return POSITIVE_INFINITY", 371 Double.POSITIVE_INFINITY, StrictMath.expm1(Double.POSITIVE_INFINITY)); 372 assertEquals("Should return -1.0", -1.0, StrictMath 373 .expm1(Double.NEGATIVE_INFINITY)); 374 assertEquals(Double.doubleToLongBits(0.0), Double 375 .doubleToLongBits(StrictMath.expm1(0.0))); 376 assertEquals(Double.doubleToLongBits(+0.0), Double 377 .doubleToLongBits(StrictMath.expm1(+0.0))); 378 assertEquals(Double.doubleToLongBits(-0.0), Double 379 .doubleToLongBits(StrictMath.expm1(-0.0))); 380 381 assertEquals("Should return -9.999950000166666E-6", 382 -9.999950000166666E-6, StrictMath.expm1(-0.00001)); 383 assertEquals("Should return 1.0145103074469635E60", 384 1.0145103074469635E60, StrictMath.expm1(138.16951162)); 385 assertEquals("Should return POSITIVE_INFINITY", 386 Double.POSITIVE_INFINITY, StrictMath 387 .expm1(123456789123456789123456789.4521584223)); 388 assertEquals("Should return POSITIVE_INFINITY", 389 Double.POSITIVE_INFINITY, StrictMath.expm1(Double.MAX_VALUE)); 390 assertEquals("Should return MIN_VALUE", Double.MIN_VALUE, StrictMath 391 .expm1(Double.MIN_VALUE)); 392 393 } 394 395 /** 396 * @tests java.lang.StrictMath#floor(double) 397 */ 398 public void test_floorD() { 399 // Test for method double java.lang.StrictMath.floor(double) 400 assertEquals("Incorrect floor for double", 401 78, StrictMath.floor(78.89), 0.0); 402 assertEquals("Incorrect floor for double", 403 -79, StrictMath.floor(-78.89), 0.0); 404 } 405 406 /** 407 * @tests {@link java.lang.StrictMath#getExponent(double)} 408 * @since 1.6 409 */ 410 @SuppressWarnings("boxing") 411 public void test_getExponent_D() { 412 for (int i = 0; i < GETEXPONENT_D_CASES.length; i++) { 413 final double number = GETEXPONENT_D_CASES[i]; 414 final int result = GETEXPONENT_D_RESULTS[i]; 415 assertEquals("Wrong result of getExponent(double).", result, 416 StrictMath.getExponent(number)); 417 } 418 419 try { 420 StrictMath.getExponent((Double) null); 421 fail("Should throw NullPointerException"); 422 } catch (NullPointerException e) { 423 // Expected 424 } 425 } 426 427 /** 428 * @tests {@link java.lang.StrictMath#getExponent(float)} 429 * @since 1.6 430 */ 431 @SuppressWarnings("boxing") 432 public void test_getExponent_F() { 433 for (int i = 0; i < GETEXPONENT_F_CASES.length; i++) { 434 final float number = GETEXPONENT_F_CASES[i]; 435 final int result = GETEXPONENT_F_RESULTS[i]; 436 assertEquals("Wrong result of getExponent(float).", result, 437 StrictMath.getExponent(number)); 438 } 439 try { 440 StrictMath.getExponent((Float) null); 441 fail("Should throw NullPointerException"); 442 } catch (NullPointerException e) { 443 // Expected 444 } 445 } 446 447 /** 448 * @tests java.lang.StrictMath#hypot(double, double) 449 */ 450 @SuppressWarnings("boxing") 451 public void test_hypot_DD() { 452 // Test for special cases 453 assertEquals("Should return POSITIVE_INFINITY", 454 Double.POSITIVE_INFINITY, StrictMath.hypot(Double.POSITIVE_INFINITY, 455 1.0)); 456 assertEquals("Should return POSITIVE_INFINITY", 457 Double.POSITIVE_INFINITY, StrictMath.hypot(Double.NEGATIVE_INFINITY, 458 123.324)); 459 assertEquals("Should return POSITIVE_INFINITY", 460 Double.POSITIVE_INFINITY, StrictMath.hypot(-758.2587, 461 Double.POSITIVE_INFINITY)); 462 assertEquals("Should return POSITIVE_INFINITY", 463 Double.POSITIVE_INFINITY, StrictMath.hypot(5687.21, 464 Double.NEGATIVE_INFINITY)); 465 assertEquals("Should return POSITIVE_INFINITY", 466 Double.POSITIVE_INFINITY, StrictMath.hypot(Double.POSITIVE_INFINITY, 467 Double.NEGATIVE_INFINITY)); 468 assertEquals("Should return POSITIVE_INFINITY", 469 Double.POSITIVE_INFINITY, StrictMath.hypot(Double.NEGATIVE_INFINITY, 470 Double.POSITIVE_INFINITY)); 471 assertTrue("Should return NaN",Double.isNaN(StrictMath.hypot(Double.NaN, 472 2342301.89843))); 473 assertTrue("Should return NaN",Double.isNaN(StrictMath.hypot(-345.2680, 474 Double.NaN))); 475 476 assertEquals("Should return 2396424.905416697", 2396424.905416697, StrictMath 477 .hypot(12322.12, -2396393.2258)); 478 assertEquals("Should return 138.16958070558556", 138.16958070558556, 479 StrictMath.hypot(-138.16951162, 0.13817035864)); 480 assertEquals("Should return 1.7976931348623157E308", 481 1.7976931348623157E308, StrictMath.hypot(Double.MAX_VALUE, 211370.35)); 482 assertEquals("Should return 5413.7185", 5413.7185, StrictMath.hypot( 483 -5413.7185, Double.MIN_VALUE)); 484 485 } 486 487 /** 488 * @tests java.lang.StrictMath#IEEEremainder(double, double) 489 */ 490 public void test_IEEEremainderDD() { 491 // Test for method double java.lang.StrictMath.IEEEremainder(double, 492 // double) 493 assertEquals("Incorrect remainder returned", 0.0, StrictMath.IEEEremainder( 494 1.0, 1.0), 0.0); 495 assertTrue( 496 "Incorrect remainder returned", 497 StrictMath.IEEEremainder(1.32, 89.765) >= 1.4705063220631647E-2 498 || StrictMath.IEEEremainder(1.32, 89.765) >= 1.4705063220631649E-2); 499 } 500 501 /** 502 * @tests java.lang.StrictMath#log(double) 503 */ 504 public void test_logD() { 505 // Test for method double java.lang.StrictMath.log(double) 506 for (double d = 10; d >= -10; d -= 0.5) { 507 double answer = StrictMath.log(StrictMath.exp(d)); 508 assertTrue("Answer does not equal expected answer for d = " + d 509 + " answer = " + answer, 510 StrictMath.abs(answer - d) <= StrictMath 511 .abs(d * 0.00000001)); 512 } 513 } 514 515 /** 516 * @tests java.lang.StrictMath#log10(double) 517 */ 518 @SuppressWarnings("boxing") 519 public void test_log10_D() { 520 // Test for special cases 521 assertTrue("Should return NaN", Double.isNaN(StrictMath 522 .log10(Double.NaN))); 523 assertTrue("Should return NaN", Double.isNaN(StrictMath 524 .log10(-2541.05745687234187532))); 525 assertEquals("Should return POSITIVE_INFINITY", 526 Double.POSITIVE_INFINITY, StrictMath 527 .log10(Double.POSITIVE_INFINITY)); 528 assertEquals("Should return NEGATIVE_INFINITY", 529 Double.NEGATIVE_INFINITY, StrictMath.log10(0.0)); 530 assertEquals("Should return NEGATIVE_INFINITY", 531 Double.NEGATIVE_INFINITY, StrictMath.log10(+0.0)); 532 assertEquals("Should return NEGATIVE_INFINITY", 533 Double.NEGATIVE_INFINITY, StrictMath.log10(-0.0)); 534 assertEquals("Should return 14.0", 14.0, StrictMath.log10(StrictMath 535 .pow(10, 14))); 536 537 assertEquals("Should return 3.7389561269540406", 3.7389561269540406, 538 StrictMath.log10(5482.2158)); 539 assertEquals("Should return 14.661551142893833", 14.661551142893833, 540 StrictMath.log10(458723662312872.125782332587)); 541 assertEquals("Should return -0.9083828622192334", -0.9083828622192334, 542 StrictMath.log10(0.12348583358871)); 543 assertEquals("Should return 308.25471555991675", 308.25471555991675, 544 StrictMath.log10(Double.MAX_VALUE)); 545 assertEquals("Should return -323.3062153431158", -323.3062153431158, 546 StrictMath.log10(Double.MIN_VALUE)); 547 } 548 549 /** 550 * @tests java.lang.StrictMath#log1p(double) 551 */ 552 @SuppressWarnings("boxing") 553 public void test_log1p_D() { 554 // Test for special cases 555 assertTrue("Should return NaN", Double.isNaN(StrictMath 556 .log1p(Double.NaN))); 557 assertTrue("Should return NaN", Double.isNaN(StrictMath 558 .log1p(-32.0482175))); 559 assertEquals("Should return POSITIVE_INFINITY", 560 Double.POSITIVE_INFINITY, StrictMath 561 .log1p(Double.POSITIVE_INFINITY)); 562 assertEquals(Double.doubleToLongBits(0.0), Double 563 .doubleToLongBits(StrictMath.log1p(0.0))); 564 assertEquals(Double.doubleToLongBits(+0.0), Double 565 .doubleToLongBits(StrictMath.log1p(+0.0))); 566 assertEquals(Double.doubleToLongBits(-0.0), Double 567 .doubleToLongBits(StrictMath.log1p(-0.0))); 568 569 assertEquals("Should return -0.2941782295312541", -0.2941782295312541, 570 StrictMath.log1p(-0.254856327)); 571 assertEquals("Should return 7.368050685564151", 7.368050685564151, 572 StrictMath.log1p(1583.542)); 573 assertEquals("Should return 0.4633708685409921", 0.4633708685409921, 574 StrictMath.log1p(0.5894227)); 575 assertEquals("Should return 709.782712893384", 709.782712893384, 576 StrictMath.log1p(Double.MAX_VALUE)); 577 assertEquals("Should return Double.MIN_VALUE", Double.MIN_VALUE, 578 StrictMath.log1p(Double.MIN_VALUE)); 579 } 580 581 /** 582 * @tests java.lang.StrictMath#max(double, double) 583 */ 584 public void test_maxDD() { 585 // Test for method double java.lang.StrictMath.max(double, double) 586 assertEquals("Incorrect double max value", 1908897.6000089, StrictMath.max( 587 -1908897.6000089, 1908897.6000089), 0D); 588 assertEquals("Incorrect double max value", 1908897.6000089, StrictMath.max(2.0, 589 1908897.6000089), 0D); 590 assertEquals("Incorrect double max value", -2.0, StrictMath.max(-2.0, 591 -1908897.6000089), 0D); 592 593 } 594 595 /** 596 * @tests java.lang.StrictMath#max(float, float) 597 */ 598 public void test_maxFF() { 599 // Test for method float java.lang.StrictMath.max(float, float) 600 assertTrue("Incorrect float max value", StrictMath.max(-1908897.600f, 601 1908897.600f) == 1908897.600f); 602 assertTrue("Incorrect float max value", StrictMath.max(2.0f, 603 1908897.600f) == 1908897.600f); 604 assertTrue("Incorrect float max value", StrictMath.max(-2.0f, 605 -1908897.600f) == -2.0f); 606 } 607 608 /** 609 * @tests java.lang.StrictMath#max(int, int) 610 */ 611 public void test_maxII() { 612 // Test for method int java.lang.StrictMath.max(int, int) 613 assertEquals("Incorrect int max value", 19088976, StrictMath.max(-19088976, 614 19088976)); 615 assertEquals("Incorrect int max value", 616 19088976, StrictMath.max(20, 19088976)); 617 assertEquals("Incorrect int max value", 618 -20, StrictMath.max(-20, -19088976)); 619 } 620 621 /** 622 * @tests java.lang.StrictMath#max(long, long) 623 */ 624 public void test_maxJJ() { 625 // Test for method long java.lang.StrictMath.max(long, long) 626 assertEquals("Incorrect long max value", 19088976000089L, StrictMath.max(-19088976000089L, 627 19088976000089L)); 628 assertEquals("Incorrect long max value", 19088976000089L, StrictMath.max(20, 629 19088976000089L)); 630 assertEquals("Incorrect long max value", -20, StrictMath.max(-20, 631 -19088976000089L)); 632 } 633 634 /** 635 * @tests java.lang.StrictMath#min(double, double) 636 */ 637 public void test_minDD() { 638 // Test for method double java.lang.StrictMath.min(double, double) 639 assertEquals("Incorrect double min value", -1908897.6000089, StrictMath.min( 640 -1908897.6000089, 1908897.6000089), 0D); 641 assertEquals("Incorrect double min value", 2.0, StrictMath.min(2.0, 642 1908897.6000089), 0D); 643 assertEquals("Incorrect double min value", -1908897.6000089, StrictMath.min(-2.0, 644 -1908897.6000089), 0D); 645 } 646 647 /** 648 * @tests java.lang.StrictMath#min(float, float) 649 */ 650 public void test_minFF() { 651 // Test for method float java.lang.StrictMath.min(float, float) 652 assertTrue("Incorrect float min value", StrictMath.min(-1908897.600f, 653 1908897.600f) == -1908897.600f); 654 assertTrue("Incorrect float min value", StrictMath.min(2.0f, 655 1908897.600f) == 2.0f); 656 assertTrue("Incorrect float min value", StrictMath.min(-2.0f, 657 -1908897.600f) == -1908897.600f); 658 } 659 660 /** 661 * @tests java.lang.StrictMath#min(int, int) 662 */ 663 public void test_minII() { 664 // Test for method int java.lang.StrictMath.min(int, int) 665 assertEquals("Incorrect int min value", -19088976, StrictMath.min(-19088976, 666 19088976)); 667 assertEquals("Incorrect int min value", 668 20, StrictMath.min(20, 19088976)); 669 assertEquals("Incorrect int min value", 670 -19088976, StrictMath.min(-20, -19088976)); 671 672 } 673 674 /** 675 * @tests java.lang.StrictMath#min(long, long) 676 */ 677 public void test_minJJ() { 678 // Test for method long java.lang.StrictMath.min(long, long) 679 assertEquals("Incorrect long min value", -19088976000089L, StrictMath.min(-19088976000089L, 680 19088976000089L)); 681 assertEquals("Incorrect long min value", 20, StrictMath.min(20, 682 19088976000089L)); 683 assertEquals("Incorrect long min value", -19088976000089L, StrictMath.min(-20, 684 -19088976000089L)); 685 } 686 687 /** 688 * @tests {@link java.lang.StrictMath#nextAfter(double, double)} 689 * @since 1.6 690 */ 691 @SuppressWarnings("boxing") 692 public void test_nextAfter_DD() { 693 // test for most cases without exception 694 for (int i = 0; i < NEXTAFTER_DD_START_CASES.length; i++) { 695 final double start = NEXTAFTER_DD_START_CASES[i][0]; 696 final long nextUpBits = Double 697 .doubleToLongBits(NEXTAFTER_DD_START_CASES[i][1]); 698 final long nextDownBits = Double 699 .doubleToLongBits(NEXTAFTER_DD_START_CASES[i][2]); 700 701 for (int j = 0; j < NEXTAFTER_DD_FD_DIRECTION_CASES.length; j++) { 702 final double direction = NEXTAFTER_DD_FD_DIRECTION_CASES[j]; 703 final long resultBits = Double.doubleToLongBits(StrictMath 704 .nextAfter(start, direction)); 705 final long directionBits = Double.doubleToLongBits(direction); 706 if (direction > start) { 707 assertEquals("Result should be next up-number.", 708 nextUpBits, resultBits); 709 } else if (direction < start) { 710 assertEquals("Result should be next down-number.", 711 nextDownBits, resultBits); 712 } else { 713 assertEquals("Result should be direction.", directionBits, 714 resultBits); 715 } 716 } 717 } 718 719 // test for cases with NaN 720 for (int i = 0; i < NEXTAFTER_DD_START_CASES.length; i++) { 721 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 722 .nextAfter(NEXTAFTER_DD_START_CASES[i][0], Double.NaN))); 723 } 724 for (int i = 0; i < NEXTAFTER_DD_FD_DIRECTION_CASES.length; i++) { 725 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 726 .nextAfter(Double.NaN, NEXTAFTER_DD_FD_DIRECTION_CASES[i]))); 727 } 728 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 729 .nextAfter(Double.NaN, Double.NaN))); 730 731 // test for exception 732 try { 733 StrictMath.nextAfter((Double) null, 2.3); 734 fail("Should throw NullPointerException"); 735 } catch (NullPointerException e) { 736 // Expected 737 } 738 try { 739 StrictMath.nextAfter(2.3, (Double) null); 740 fail("Should throw NullPointerException"); 741 } catch (NullPointerException e) { 742 // Expected 743 } 744 try { 745 StrictMath.nextAfter((Double) null, (Double) null); 746 fail("Should throw NullPointerException"); 747 } catch (NullPointerException e) { 748 // Expected 749 } 750 } 751 752 /** 753 * @tests {@link java.lang.StrictMath#nextAfter(float, double)} 754 * @since 1.6 755 */ 756 @SuppressWarnings("boxing") 757 public void test_nextAfter_FD() { 758 // test for most cases without exception 759 for (int i = 0; i < NEXTAFTER_FD_START_CASES.length; i++) { 760 final float start = NEXTAFTER_FD_START_CASES[i][0]; 761 final int nextUpBits = Float 762 .floatToIntBits(NEXTAFTER_FD_START_CASES[i][1]); 763 final int nextDownBits = Float 764 .floatToIntBits(NEXTAFTER_FD_START_CASES[i][2]); 765 766 for (int j = 0; j < NEXTAFTER_DD_FD_DIRECTION_CASES.length; j++) { 767 final double direction = NEXTAFTER_DD_FD_DIRECTION_CASES[j]; 768 final int resultBits = Float.floatToIntBits(StrictMath 769 .nextAfter(start, direction)); 770 if (direction > start) { 771 assertEquals("Result should be next up-number.", 772 nextUpBits, resultBits); 773 } else if (direction < start) { 774 assertEquals("Result should be next down-number.", 775 nextDownBits, resultBits); 776 } else { 777 final int equivalentBits = Float.floatToIntBits(new Float( 778 direction)); 779 assertEquals( 780 "Result should be a number equivalent to direction.", 781 equivalentBits, resultBits); 782 } 783 } 784 } 785 786 // test for cases with NaN 787 for (int i = 0; i < NEXTAFTER_FD_START_CASES.length; i++) { 788 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 789 .nextAfter(NEXTAFTER_FD_START_CASES[i][0], Float.NaN))); 790 } 791 for (int i = 0; i < NEXTAFTER_DD_FD_DIRECTION_CASES.length; i++) { 792 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 793 .nextAfter(Float.NaN, NEXTAFTER_DD_FD_DIRECTION_CASES[i]))); 794 } 795 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 796 .nextAfter(Float.NaN, Float.NaN))); 797 798 // test for exception 799 try { 800 StrictMath.nextAfter((Float) null, 2.3); 801 fail("Should throw NullPointerException"); 802 } catch (NullPointerException e) { 803 // Expected 804 } 805 try { 806 StrictMath.nextAfter(2.3, (Float) null); 807 fail("Should throw NullPointerException"); 808 } catch (NullPointerException e) { 809 // Expected 810 } 811 try { 812 StrictMath.nextAfter((Float) null, (Float) null); 813 fail("Should throw NullPointerException"); 814 } catch (NullPointerException e) { 815 // Expected 816 } 817 } 818 819 /** 820 * @tests {@link java.lang.StrictMath#nextUp(double)} 821 * @since 1.6 822 */ 823 @SuppressWarnings("boxing") 824 public void test_nextUp_D() { 825 // This method is semantically equivalent to nextAfter(d, 826 // Double.POSITIVE_INFINITY), 827 // so we use the data of test_nextAfter_DD 828 for (int i = 0; i < NEXTAFTER_DD_START_CASES.length; i++) { 829 final double start = NEXTAFTER_DD_START_CASES[i][0]; 830 final long nextUpBits = Double 831 .doubleToLongBits(NEXTAFTER_DD_START_CASES[i][1]); 832 final long resultBits = Double.doubleToLongBits(StrictMath 833 .nextUp(start)); 834 assertEquals("Result should be next up-number.", nextUpBits, 835 resultBits); 836 } 837 838 // test for cases with NaN 839 assertTrue("The result should be NaN.", Double.isNaN(StrictMath 840 .nextUp(Double.NaN))); 841 842 // test for exception 843 try { 844 StrictMath.nextUp((Double) null); 845 fail("Should throw NullPointerException"); 846 } catch (NullPointerException e) { 847 // Expected 848 } 849 } 850 851 /** 852 * @tests {@link java.lang.StrictMath#nextUp(float)} 853 * @since 1.6 854 */ 855 @SuppressWarnings("boxing") 856 public void test_nextUp_F() { 857 // This method is semantically equivalent to nextAfter(f, 858 // Float.POSITIVE_INFINITY), 859 // so we use the data of test_nextAfter_FD 860 for (int i = 0; i < NEXTAFTER_FD_START_CASES.length; i++) { 861 final float start = NEXTAFTER_FD_START_CASES[i][0]; 862 final int nextUpBits = Float 863 .floatToIntBits(NEXTAFTER_FD_START_CASES[i][1]); 864 final int resultBits = Float.floatToIntBits(StrictMath 865 .nextUp(start)); 866 assertEquals("Result should be next up-number.", nextUpBits, 867 resultBits); 868 } 869 870 // test for cases with NaN 871 assertTrue("The result should be NaN.", Float.isNaN(StrictMath 872 .nextUp(Float.NaN))); 873 874 // test for exception 875 try { 876 StrictMath.nextUp((Float) null); 877 fail("Should throw NullPointerException"); 878 } catch (NullPointerException e) { 879 // Expected 880 } 881 } 882 883 /** 884 * @tests java.lang.StrictMath#pow(double, double) 885 */ 886 public void test_powDD() { 887 // Test for method double java.lang.StrictMath.pow(double, double) 888 assertTrue("pow returned incorrect value", 889 (long) StrictMath.pow(2, 8) == 256l); 890 assertTrue("pow returned incorrect value", 891 StrictMath.pow(2, -8) == 0.00390625d); 892 } 893 894 /** 895 * @tests java.lang.StrictMath#rint(double) 896 */ 897 public void test_rintD() { 898 // Test for method double java.lang.StrictMath.rint(double) 899 assertEquals("Failed to round properly - up to odd", 900 3.0, StrictMath.rint(2.9), 0D); 901 assertTrue("Failed to round properly - NaN", Double.isNaN(StrictMath 902 .rint(Double.NaN))); 903 assertEquals("Failed to round properly down to even", 2.0, StrictMath 904 .rint(2.1), 0D); 905 assertTrue("Failed to round properly " + 2.5 + " to even", StrictMath 906 .rint(2.5) == 2.0); 907 } 908 909 /** 910 * @tests java.lang.StrictMath#round(double) 911 */ 912 public void test_roundD() { 913 // Test for method long java.lang.StrictMath.round(double) 914 assertEquals("Incorrect rounding of a float", 915 -91, StrictMath.round(-90.89d)); 916 } 917 918 /** 919 * @tests java.lang.StrictMath#round(float) 920 */ 921 public void test_roundF() { 922 // Test for method int java.lang.StrictMath.round(float) 923 assertEquals("Incorrect rounding of a float", 924 -91, StrictMath.round(-90.89f)); 925 } 926 927 /** 928 * @tests {@link java.lang.StrictMath#scalb(double, int)} 929 * @since 1.6 930 */ 931 @SuppressWarnings("boxing") 932 public void test_scalb_DI() { 933 // result is normal 934 assertEquals(4.1422946304E7, StrictMath.scalb(1.2345, 25)); 935 assertEquals(3.679096698760986E-8, StrictMath.scalb(1.2345, -25)); 936 assertEquals(1.2345, StrictMath.scalb(1.2345, 0)); 937 assertEquals(7868514.304, StrictMath.scalb(0.2345, 25)); 938 939 double normal = StrictMath.scalb(0.2345, -25); 940 assertEquals(6.98864459991455E-9, normal); 941 // precision kept 942 assertEquals(0.2345, StrictMath.scalb(normal, 25)); 943 944 assertEquals(0.2345, StrictMath.scalb(0.2345, 0)); 945 assertEquals(-4.1422946304E7, StrictMath.scalb(-1.2345, 25)); 946 assertEquals(-6.98864459991455E-9, StrictMath.scalb(-0.2345, -25)); 947 assertEquals(2.0, StrictMath.scalb(Double.MIN_NORMAL / 2, 1024)); 948 assertEquals(64.0, StrictMath.scalb(Double.MIN_VALUE, 1080)); 949 assertEquals(234, StrictMath.getExponent(StrictMath.scalb(1.0, 234))); 950 assertEquals(3.9999999999999996, StrictMath.scalb(Double.MAX_VALUE, 951 Double.MIN_EXPONENT)); 952 953 // result is near infinity 954 double halfMax = StrictMath.scalb(1.0, Double.MAX_EXPONENT); 955 assertEquals(8.98846567431158E307, halfMax); 956 assertEquals(Double.MAX_VALUE, halfMax - StrictMath.ulp(halfMax) 957 + halfMax); 958 assertEquals(Double.POSITIVE_INFINITY, halfMax + halfMax); 959 assertEquals(1.7976931348623155E308, StrictMath.scalb(1.0 - StrictMath 960 .ulp(1.0), Double.MAX_EXPONENT + 1)); 961 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 962 1.0 - StrictMath.ulp(1.0), Double.MAX_EXPONENT + 2)); 963 964 halfMax = StrictMath.scalb(-1.0, Double.MAX_EXPONENT); 965 assertEquals(-8.98846567431158E307, halfMax); 966 assertEquals(-Double.MAX_VALUE, halfMax + StrictMath.ulp(halfMax) 967 + halfMax); 968 assertEquals(Double.NEGATIVE_INFINITY, halfMax + halfMax); 969 970 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb(0.345, 1234)); 971 assertEquals(Double.POSITIVE_INFINITY, StrictMath 972 .scalb(44.345E102, 934)); 973 assertEquals(Double.NEGATIVE_INFINITY, StrictMath.scalb(-44.345E102, 974 934)); 975 976 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 977 Double.MIN_NORMAL / 2, 4000)); 978 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 979 Double.MIN_VALUE, 8000)); 980 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 981 Double.MAX_VALUE, 1)); 982 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 983 Double.POSITIVE_INFINITY, 0)); 984 assertEquals(Double.POSITIVE_INFINITY, StrictMath.scalb( 985 Double.POSITIVE_INFINITY, -1)); 986 assertEquals(Double.NEGATIVE_INFINITY, StrictMath.scalb( 987 Double.NEGATIVE_INFINITY, -1)); 988 assertEquals(Double.NEGATIVE_INFINITY, StrictMath.scalb( 989 Double.NEGATIVE_INFINITY, Double.MIN_EXPONENT)); 990 991 // result is subnormal/zero 992 long posZeroBits = Double.doubleToLongBits(+0.0); 993 long negZeroBits = Double.doubleToLongBits(-0.0); 994 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 995 +0.0, Integer.MAX_VALUE))); 996 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 997 +0.0, -123))); 998 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 999 +0.0, 0))); 1000 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1001 -0.0, 123))); 1002 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1003 -0.0, Integer.MIN_VALUE))); 1004 1005 assertEquals(Double.MIN_VALUE, StrictMath.scalb(1.0, -1074)); 1006 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb(1.0, 1007 -1075))); 1008 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1009 -1.0, -1075))); 1010 1011 // precision lost 1012 assertEquals(StrictMath.scalb(21.405, -1078), StrictMath.scalb(21.405, 1013 -1079)); 1014 assertEquals(Double.MIN_VALUE, StrictMath.scalb(21.405, -1079)); 1015 assertEquals(-Double.MIN_VALUE, StrictMath.scalb(-21.405, -1079)); 1016 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1017 21.405, -1080))); 1018 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1019 -21.405, -1080))); 1020 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1021 Double.MIN_VALUE, -1))); 1022 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1023 -Double.MIN_VALUE, -1))); 1024 assertEquals(Double.MIN_VALUE, StrictMath.scalb(Double.MIN_NORMAL, -52)); 1025 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1026 Double.MIN_NORMAL, -53))); 1027 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1028 -Double.MIN_NORMAL, -53))); 1029 assertEquals(Double.MIN_VALUE, StrictMath 1030 .scalb(Double.MAX_VALUE, -2098)); 1031 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1032 Double.MAX_VALUE, -2099))); 1033 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1034 -Double.MAX_VALUE, -2099))); 1035 assertEquals(Double.MIN_VALUE, StrictMath.scalb(Double.MIN_NORMAL / 3, 1036 -51)); 1037 assertEquals(posZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1038 Double.MIN_NORMAL / 3, -52))); 1039 assertEquals(negZeroBits, Double.doubleToLongBits(StrictMath.scalb( 1040 -Double.MIN_NORMAL / 3, -52))); 1041 double subnormal = StrictMath.scalb(Double.MIN_NORMAL / 3, -25); 1042 assertEquals(2.2104123E-316, subnormal); 1043 // precision lost 1044 assertFalse(Double.MIN_NORMAL / 3 == StrictMath.scalb(subnormal, 25)); 1045 1046 // NaN 1047 assertTrue(Double.isNaN(StrictMath.scalb(Double.NaN, 1))); 1048 assertTrue(Double.isNaN(StrictMath.scalb(Double.NaN, 0))); 1049 assertTrue(Double.isNaN(StrictMath.scalb(Double.NaN, -120))); 1050 1051 assertEquals(1283457024, Double.doubleToLongBits(StrictMath.scalb( 1052 Double.MIN_VALUE * 153, 23))); 1053 assertEquals(-9223372035571318784L, Double.doubleToLongBits(StrictMath 1054 .scalb(-Double.MIN_VALUE * 153, 23))); 1055 assertEquals(36908406321184768L, Double.doubleToLongBits(StrictMath 1056 .scalb(Double.MIN_VALUE * 153, 52))); 1057 assertEquals(-9186463630533591040L, Double.doubleToLongBits(StrictMath 1058 .scalb(-Double.MIN_VALUE * 153, 52))); 1059 1060 // test for exception 1061 try { 1062 StrictMath.scalb((Double) null, (Integer) null); 1063 fail("Should throw NullPointerException"); 1064 } catch (NullPointerException e) { 1065 // Expected 1066 } 1067 try { 1068 StrictMath.scalb(1.0, (Integer) null); 1069 fail("Should throw NullPointerException"); 1070 } catch (NullPointerException e) { 1071 // Expected 1072 } 1073 try { 1074 StrictMath.scalb((Double) null, 1); 1075 fail("Should throw NullPointerException"); 1076 } catch (NullPointerException e) { 1077 // Expected 1078 } 1079 } 1080 1081 /** 1082 * @tests {@link java.lang.StrictMath#scalb(float, int)} 1083 * @since 1.6 1084 */ 1085 @SuppressWarnings("boxing") 1086 public void test_scalb_FI() { 1087 // result is normal 1088 assertEquals(4.1422946304E7f, StrictMath.scalb(1.2345f, 25)); 1089 assertEquals(3.679096698760986E-8f, StrictMath.scalb(1.2345f, -25)); 1090 assertEquals(1.2345f, StrictMath.scalb(1.2345f, 0)); 1091 assertEquals(7868514.304f, StrictMath.scalb(0.2345f, 25)); 1092 1093 float normal = StrictMath.scalb(0.2345f, -25); 1094 assertEquals(6.98864459991455E-9f, normal); 1095 // precision kept 1096 assertEquals(0.2345f, StrictMath.scalb(normal, 25)); 1097 1098 assertEquals(0.2345f, StrictMath.scalb(0.2345f, 0)); 1099 assertEquals(-4.1422946304E7f, StrictMath.scalb(-1.2345f, 25)); 1100 assertEquals(-6.98864459991455E-9f, StrictMath.scalb(-0.2345f, -25)); 1101 assertEquals(2.0f, StrictMath.scalb(Float.MIN_NORMAL / 2, 128)); 1102 assertEquals(64.0f, StrictMath.scalb(Float.MIN_VALUE, 155)); 1103 assertEquals(34, StrictMath.getExponent(StrictMath.scalb(1.0f, 34))); 1104 assertEquals(3.9999998f, StrictMath.scalb(Float.MAX_VALUE, 1105 Float.MIN_EXPONENT)); 1106 1107 // result is near infinity 1108 float halfMax = StrictMath.scalb(1.0f, Float.MAX_EXPONENT); 1109 assertEquals(1.7014118E38f, halfMax); 1110 assertEquals(Float.MAX_VALUE, halfMax - StrictMath.ulp(halfMax) 1111 + halfMax); 1112 assertEquals(Float.POSITIVE_INFINITY, halfMax + halfMax); 1113 assertEquals(3.4028233E38f, StrictMath.scalb(1.0f - StrictMath 1114 .ulp(1.0f), Float.MAX_EXPONENT + 1)); 1115 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb( 1116 1.0f - StrictMath.ulp(1.0f), Float.MAX_EXPONENT + 2)); 1117 1118 halfMax = StrictMath.scalb(-1.0f, Float.MAX_EXPONENT); 1119 assertEquals(-1.7014118E38f, halfMax); 1120 assertEquals(-Float.MAX_VALUE, halfMax + StrictMath.ulp(halfMax) 1121 + halfMax); 1122 assertEquals(Float.NEGATIVE_INFINITY, halfMax + halfMax); 1123 1124 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb(0.345f, 1234)); 1125 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb(44.345E10f, 934)); 1126 assertEquals(Float.NEGATIVE_INFINITY, StrictMath 1127 .scalb(-44.345E10f, 934)); 1128 1129 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb( 1130 Float.MIN_NORMAL / 2, 400)); 1131 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb(Float.MIN_VALUE, 1132 800)); 1133 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb(Float.MAX_VALUE, 1134 1)); 1135 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb( 1136 Float.POSITIVE_INFINITY, 0)); 1137 assertEquals(Float.POSITIVE_INFINITY, StrictMath.scalb( 1138 Float.POSITIVE_INFINITY, -1)); 1139 assertEquals(Float.NEGATIVE_INFINITY, StrictMath.scalb( 1140 Float.NEGATIVE_INFINITY, -1)); 1141 assertEquals(Float.NEGATIVE_INFINITY, StrictMath.scalb( 1142 Float.NEGATIVE_INFINITY, Float.MIN_EXPONENT)); 1143 1144 // result is subnormal/zero 1145 int posZeroBits = Float.floatToIntBits(+0.0f); 1146 int negZeroBits = Float.floatToIntBits(-0.0f); 1147 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb(+0.0f, 1148 Integer.MAX_VALUE))); 1149 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb(+0.0f, 1150 -123))); 1151 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb(+0.0f, 1152 0))); 1153 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb(-0.0f, 1154 123))); 1155 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb(-0.0f, 1156 Integer.MIN_VALUE))); 1157 1158 assertEquals(Float.MIN_VALUE, StrictMath.scalb(1.0f, -149)); 1159 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb(1.0f, 1160 -150))); 1161 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb(-1.0f, 1162 -150))); 1163 1164 // precision lost 1165 assertEquals(StrictMath.scalb(21.405f, -154), StrictMath.scalb(21.405f, 1166 -153)); 1167 assertEquals(Float.MIN_VALUE, StrictMath.scalb(21.405f, -154)); 1168 assertEquals(-Float.MIN_VALUE, StrictMath.scalb(-21.405f, -154)); 1169 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb( 1170 21.405f, -155))); 1171 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb( 1172 -21.405f, -155))); 1173 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb( 1174 Float.MIN_VALUE, -1))); 1175 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb( 1176 -Float.MIN_VALUE, -1))); 1177 assertEquals(Float.MIN_VALUE, StrictMath.scalb(Float.MIN_NORMAL, -23)); 1178 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb( 1179 Float.MIN_NORMAL, -24))); 1180 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb( 1181 -Float.MIN_NORMAL, -24))); 1182 assertEquals(Float.MIN_VALUE, StrictMath.scalb(Float.MAX_VALUE, -277)); 1183 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb( 1184 Float.MAX_VALUE, -278))); 1185 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb( 1186 -Float.MAX_VALUE, -278))); 1187 assertEquals(Float.MIN_VALUE, StrictMath.scalb(Float.MIN_NORMAL / 3, 1188 -22)); 1189 assertEquals(posZeroBits, Float.floatToIntBits(StrictMath.scalb( 1190 Float.MIN_NORMAL / 3, -23))); 1191 assertEquals(negZeroBits, Float.floatToIntBits(StrictMath.scalb( 1192 -Float.MIN_NORMAL / 3, -23))); 1193 float subnormal = StrictMath.scalb(Float.MIN_NORMAL / 3, -11); 1194 assertEquals(1.913E-42f, subnormal); 1195 // precision lost 1196 assertFalse(Float.MIN_NORMAL / 3 == StrictMath.scalb(subnormal, 11)); 1197 1198 assertEquals(68747264, Float.floatToIntBits(StrictMath.scalb( 1199 Float.MIN_VALUE * 153, 23))); 1200 assertEquals(-2078736384, Float.floatToIntBits(StrictMath.scalb( 1201 -Float.MIN_VALUE * 153, 23))); 1202 1203 assertEquals(4896, Float.floatToIntBits(StrictMath.scalb( 1204 Float.MIN_VALUE * 153, 5))); 1205 assertEquals(-2147478752, Float.floatToIntBits(StrictMath.scalb( 1206 -Float.MIN_VALUE * 153, 5))); 1207 1208 // NaN 1209 assertTrue(Float.isNaN(StrictMath.scalb(Float.NaN, 1))); 1210 assertTrue(Float.isNaN(StrictMath.scalb(Float.NaN, 0))); 1211 assertTrue(Float.isNaN(StrictMath.scalb(Float.NaN, -120))); 1212 1213 // test for exception 1214 try { 1215 StrictMath.scalb((Float) null, (Integer) null); 1216 fail("Should throw NullPointerException"); 1217 } catch (NullPointerException e) { 1218 // Expected 1219 } 1220 try { 1221 StrictMath.scalb(1.0f, (Integer) null); 1222 fail("Should throw NullPointerException"); 1223 } catch (NullPointerException e) { 1224 // Expected 1225 } 1226 try { 1227 StrictMath.scalb((Float) null, 1); 1228 fail("Should throw NullPointerException"); 1229 } catch (NullPointerException e) { 1230 // Expected 1231 } 1232 } 1233 1234 /** 1235 * @tests java.lang.StrictMath#signum(double) 1236 */ 1237 public void test_signum_D() { 1238 assertTrue(Double.isNaN(StrictMath.signum(Double.NaN))); 1239 assertEquals(Double.doubleToLongBits(0.0), Double 1240 .doubleToLongBits(StrictMath.signum(0.0))); 1241 assertEquals(Double.doubleToLongBits(+0.0), Double 1242 .doubleToLongBits(StrictMath.signum(+0.0))); 1243 assertEquals(Double.doubleToLongBits(-0.0), Double 1244 .doubleToLongBits(StrictMath.signum(-0.0))); 1245 1246 assertEquals(1.0, StrictMath.signum(253681.2187962), 0D); 1247 assertEquals(-1.0, StrictMath.signum(-125874693.56), 0D); 1248 assertEquals(1.0, StrictMath.signum(1.2587E-308), 0D); 1249 assertEquals(-1.0, StrictMath.signum(-1.2587E-308), 0D); 1250 1251 assertEquals(1.0, StrictMath.signum(Double.MAX_VALUE), 0D); 1252 assertEquals(1.0, StrictMath.signum(Double.MIN_VALUE), 0D); 1253 assertEquals(-1.0, StrictMath.signum(-Double.MAX_VALUE), 0D); 1254 assertEquals(-1.0, StrictMath.signum(-Double.MIN_VALUE), 0D); 1255 assertEquals(1.0, StrictMath.signum(Double.POSITIVE_INFINITY), 0D); 1256 assertEquals(-1.0, StrictMath.signum(Double.NEGATIVE_INFINITY), 0D); 1257 1258 } 1259 1260 /** 1261 * @tests java.lang.StrictMath#signum(float) 1262 */ 1263 public void test_signum_F() { 1264 assertTrue(Float.isNaN(StrictMath.signum(Float.NaN))); 1265 assertEquals(Float.floatToIntBits(0.0f), Float 1266 .floatToIntBits(StrictMath.signum(0.0f))); 1267 assertEquals(Float.floatToIntBits(+0.0f), Float 1268 .floatToIntBits(StrictMath.signum(+0.0f))); 1269 assertEquals(Float.floatToIntBits(-0.0f), Float 1270 .floatToIntBits(StrictMath.signum(-0.0f))); 1271 1272 assertEquals(1.0f, StrictMath.signum(253681.2187962f), 0f); 1273 assertEquals(-1.0f, StrictMath.signum(-125874693.56f), 0f); 1274 assertEquals(1.0f, StrictMath.signum(1.2587E-11f), 0f); 1275 assertEquals(-1.0f, StrictMath.signum(-1.2587E-11f), 0f); 1276 1277 assertEquals(1.0f, StrictMath.signum(Float.MAX_VALUE), 0f); 1278 assertEquals(1.0f, StrictMath.signum(Float.MIN_VALUE), 0f); 1279 assertEquals(-1.0f, StrictMath.signum(-Float.MAX_VALUE), 0f); 1280 assertEquals(-1.0f, StrictMath.signum(-Float.MIN_VALUE), 0f); 1281 assertEquals(1.0f, StrictMath.signum(Float.POSITIVE_INFINITY), 0f); 1282 assertEquals(-1.0f, StrictMath.signum(Float.NEGATIVE_INFINITY), 0f); 1283 } 1284 1285 /** 1286 * @tests java.lang.StrictMath#sin(double) 1287 */ 1288 public void test_sinD() { 1289 // Test for method double java.lang.StrictMath.sin(double) 1290 assertTrue("Returned incorrect sine", StrictMath.sin(StrictMath 1291 .asin(OPP / HYP)) == OPP / HYP); 1292 } 1293 1294 /** 1295 * @tests java.lang.StrictMath#sinh(double) 1296 */ 1297 public void test_sinh_D() { 1298 // Test for special situations 1299 assertTrue(Double.isNaN(StrictMath.sinh(Double.NaN))); 1300 assertEquals("Should return POSITIVE_INFINITY", 1301 Double.POSITIVE_INFINITY, StrictMath 1302 .sinh(Double.POSITIVE_INFINITY), 0D); 1303 assertEquals("Should return NEGATIVE_INFINITY", 1304 Double.NEGATIVE_INFINITY, StrictMath 1305 .sinh(Double.NEGATIVE_INFINITY), 0D); 1306 assertEquals(Double.doubleToLongBits(0.0), Double 1307 .doubleToLongBits(StrictMath.sinh(0.0))); 1308 assertEquals(Double.doubleToLongBits(+0.0), Double 1309 .doubleToLongBits(StrictMath.sinh(+0.0))); 1310 assertEquals(Double.doubleToLongBits(-0.0), Double 1311 .doubleToLongBits(StrictMath.sinh(-0.0))); 1312 1313 assertEquals("Should return POSITIVE_INFINITY", 1314 Double.POSITIVE_INFINITY, StrictMath.sinh(1234.56), 0D); 1315 assertEquals("Should return NEGATIVE_INFINITY", 1316 Double.NEGATIVE_INFINITY, StrictMath.sinh(-1234.56), 0D); 1317 assertEquals("Should return 1.0000000000001666E-6", 1318 1.0000000000001666E-6, StrictMath.sinh(0.000001), 0D); 1319 assertEquals("Should return -1.0000000000001666E-6", 1320 -1.0000000000001666E-6, StrictMath.sinh(-0.000001), 0D); 1321 assertEquals("Should return 5.115386441963859", 5.115386441963859, 1322 StrictMath.sinh(2.33482), 0D); 1323 assertEquals("Should return POSITIVE_INFINITY", 1324 Double.POSITIVE_INFINITY, StrictMath.sinh(Double.MAX_VALUE), 0D); 1325 assertEquals("Should return 4.9E-324", 4.9E-324, StrictMath 1326 .sinh(Double.MIN_VALUE), 0D); 1327 } 1328 1329 /** 1330 * @tests java.lang.StrictMath#sqrt(double) 1331 */ 1332 public void test_sqrtD() { 1333 // Test for method double java.lang.StrictMath.sqrt(double) 1334 assertEquals("Incorrect root returned1", 1335 2, StrictMath.sqrt(StrictMath.pow(StrictMath.sqrt(2), 4)), 0.0); 1336 assertEquals("Incorrect root returned2", 7, StrictMath.sqrt(49), 0.0); 1337 } 1338 1339 /** 1340 * @tests java.lang.StrictMath#tan(double) 1341 */ 1342 public void test_tanD() { 1343 // Test for method double java.lang.StrictMath.tan(double) 1344 assertTrue( 1345 "Returned incorrect tangent: ", 1346 StrictMath.tan(StrictMath.atan(1.0)) <= 1.0 1347 || StrictMath.tan(StrictMath.atan(1.0)) >= 9.9999999999999983E-1); 1348 } 1349 1350 /** 1351 * @tests java.lang.StrictMath#tanh(double) 1352 */ 1353 public void test_tanh_D() { 1354 // Test for special situations 1355 assertTrue(Double.isNaN(StrictMath.tanh(Double.NaN))); 1356 assertEquals("Should return +1.0", +1.0, StrictMath 1357 .tanh(Double.POSITIVE_INFINITY), 0D); 1358 assertEquals("Should return -1.0", -1.0, StrictMath 1359 .tanh(Double.NEGATIVE_INFINITY), 0D); 1360 assertEquals(Double.doubleToLongBits(0.0), Double 1361 .doubleToLongBits(StrictMath.tanh(0.0))); 1362 assertEquals(Double.doubleToLongBits(+0.0), Double 1363 .doubleToLongBits(StrictMath.tanh(+0.0))); 1364 assertEquals(Double.doubleToLongBits(-0.0), Double 1365 .doubleToLongBits(StrictMath.tanh(-0.0))); 1366 1367 assertEquals("Should return 1.0", 1.0, StrictMath.tanh(1234.56), 0D); 1368 assertEquals("Should return -1.0", -1.0, StrictMath.tanh(-1234.56), 0D); 1369 assertEquals("Should return 9.999999999996666E-7", 1370 9.999999999996666E-7, StrictMath.tanh(0.000001), 0D); 1371 assertEquals("Should return 0.981422884124941", 0.981422884124941, 1372 StrictMath.tanh(2.33482), 0D); 1373 assertEquals("Should return 1.0", 1.0, StrictMath 1374 .tanh(Double.MAX_VALUE), 0D); 1375 assertEquals("Should return 4.9E-324", 4.9E-324, StrictMath 1376 .tanh(Double.MIN_VALUE), 0D); 1377 } 1378 1379 /** 1380 * @tests java.lang.StrictMath#random() 1381 */ 1382 public void test_random() { 1383 // There isn't a place for these tests so just stick them here 1384 assertEquals("Wrong value E", 1385 4613303445314885481L, Double.doubleToLongBits(StrictMath.E)); 1386 assertEquals("Wrong value PI", 1387 4614256656552045848L, Double.doubleToLongBits(StrictMath.PI)); 1388 1389 for (int i = 500; i >= 0; i--) { 1390 double d = StrictMath.random(); 1391 assertTrue("Generated number is out of range: " + d, d >= 0.0 1392 && d < 1.0); 1393 } 1394 } 1395 1396 /** 1397 * @tests java.lang.StrictMath#toRadians(double) 1398 */ 1399 public void test_toRadiansD() { 1400 for (double d = 500; d >= 0; d -= 1.0) { 1401 double converted = StrictMath.toDegrees(StrictMath.toRadians(d)); 1402 assertTrue("Converted number not equal to original. d = " + d, 1403 converted >= d * 0.99999999 && converted <= d * 1.00000001); 1404 } 1405 } 1406 1407 /** 1408 * @tests java.lang.StrictMath#toDegrees(double) 1409 */ 1410 public void test_toDegreesD() { 1411 for (double d = 500; d >= 0; d -= 1.0) { 1412 double converted = StrictMath.toRadians(StrictMath.toDegrees(d)); 1413 assertTrue("Converted number not equal to original. d = " + d, 1414 converted >= d * 0.99999999 && converted <= d * 1.00000001); 1415 } 1416 } 1417 1418 /** 1419 * @tests java.lang.StrictMath#ulp(double) 1420 */ 1421 @SuppressWarnings("boxing") 1422 public void test_ulp_D() { 1423 // Test for special cases 1424 assertTrue("Should return NaN", Double 1425 .isNaN(StrictMath.ulp(Double.NaN))); 1426 assertEquals("Returned incorrect value", Double.POSITIVE_INFINITY, 1427 StrictMath.ulp(Double.POSITIVE_INFINITY), 0D); 1428 assertEquals("Returned incorrect value", Double.POSITIVE_INFINITY, 1429 StrictMath.ulp(Double.NEGATIVE_INFINITY), 0D); 1430 assertEquals("Returned incorrect value", Double.MIN_VALUE, StrictMath 1431 .ulp(0.0), 0D); 1432 assertEquals("Returned incorrect value", Double.MIN_VALUE, StrictMath 1433 .ulp(+0.0), 0D); 1434 assertEquals("Returned incorrect value", Double.MIN_VALUE, StrictMath 1435 .ulp(-0.0), 0D); 1436 assertEquals("Returned incorrect value", StrictMath.pow(2, 971), 1437 StrictMath.ulp(Double.MAX_VALUE), 0D); 1438 assertEquals("Returned incorrect value", StrictMath.pow(2, 971), 1439 StrictMath.ulp(-Double.MAX_VALUE), 0D); 1440 1441 assertEquals("Returned incorrect value", Double.MIN_VALUE, StrictMath 1442 .ulp(Double.MIN_VALUE), 0D); 1443 assertEquals("Returned incorrect value", Double.MIN_VALUE, StrictMath 1444 .ulp(-Double.MIN_VALUE), 0D); 1445 1446 assertEquals("Returned incorrect value", 2.220446049250313E-16, 1447 StrictMath.ulp(1.0), 0D); 1448 assertEquals("Returned incorrect value", 2.220446049250313E-16, 1449 StrictMath.ulp(-1.0), 0D); 1450 assertEquals("Returned incorrect value", 2.2737367544323206E-13, 1451 StrictMath.ulp(1153.0), 0D); 1452 } 1453 1454 /** 1455 * @tests java.lang.StrictMath#ulp(float) 1456 */ 1457 @SuppressWarnings("boxing") 1458 public void test_ulp_f() { 1459 // Test for special cases 1460 assertTrue("Should return NaN", Float.isNaN(StrictMath.ulp(Float.NaN))); 1461 assertEquals("Returned incorrect value", Float.POSITIVE_INFINITY, 1462 StrictMath.ulp(Float.POSITIVE_INFINITY), 0f); 1463 assertEquals("Returned incorrect value", Float.POSITIVE_INFINITY, 1464 StrictMath.ulp(Float.NEGATIVE_INFINITY), 0f); 1465 assertEquals("Returned incorrect value", Float.MIN_VALUE, StrictMath 1466 .ulp(0.0f), 0f); 1467 assertEquals("Returned incorrect value", Float.MIN_VALUE, StrictMath 1468 .ulp(+0.0f), 0f); 1469 assertEquals("Returned incorrect value", Float.MIN_VALUE, StrictMath 1470 .ulp(-0.0f), 0f); 1471 assertEquals("Returned incorrect value", 2.028241E31f, StrictMath 1472 .ulp(Float.MAX_VALUE), 0f); 1473 assertEquals("Returned incorrect value", 2.028241E31f, StrictMath 1474 .ulp(-Float.MAX_VALUE), 0f); 1475 1476 assertEquals("Returned incorrect value", 1.4E-45f, StrictMath 1477 .ulp(Float.MIN_VALUE), 0f); 1478 assertEquals("Returned incorrect value", 1.4E-45f, StrictMath 1479 .ulp(-Float.MIN_VALUE), 0f); 1480 1481 assertEquals("Returned incorrect value", 1.1920929E-7f, StrictMath 1482 .ulp(1.0f), 0f); 1483 assertEquals("Returned incorrect value", 1.1920929E-7f, StrictMath 1484 .ulp(-1.0f), 0f); 1485 assertEquals("Returned incorrect value", 1.2207031E-4f, StrictMath 1486 .ulp(1153.0f), 0f); 1487 assertEquals("Returned incorrect value", 5.6E-45f, Math 1488 .ulp(9.403954E-38f), 0f); 1489 } 1490 } 1491