test-diy-fp.cc 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2006-2008 the V8 project authors. All rights reserved.
  2. #include <stdlib.h>
  3. #include "cctest.h"
  4. #include "diy-fp.h"
  5. #include "utils.h"
  6. using namespace double_conversion;
  7. TEST(Subtract) {
  8. DiyFp diy_fp1 = DiyFp(3, 0);
  9. DiyFp diy_fp2 = DiyFp(1, 0);
  10. DiyFp diff = DiyFp::Minus(diy_fp1, diy_fp2);
  11. CHECK(2 == diff.f()); // NOLINT
  12. CHECK_EQ(0, diff.e());
  13. diy_fp1.Subtract(diy_fp2);
  14. CHECK(2 == diy_fp1.f()); // NOLINT
  15. CHECK_EQ(0, diy_fp1.e());
  16. }
  17. TEST(Multiply) {
  18. DiyFp diy_fp1 = DiyFp(3, 0);
  19. DiyFp diy_fp2 = DiyFp(2, 0);
  20. DiyFp product = DiyFp::Times(diy_fp1, diy_fp2);
  21. CHECK(0 == product.f()); // NOLINT
  22. CHECK_EQ(64, product.e());
  23. diy_fp1.Multiply(diy_fp2);
  24. CHECK(0 == diy_fp1.f()); // NOLINT
  25. CHECK_EQ(64, diy_fp1.e());
  26. diy_fp1 = DiyFp(UINT64_2PART_C(0x80000000, 00000000), 11);
  27. diy_fp2 = DiyFp(2, 13);
  28. product = DiyFp::Times(diy_fp1, diy_fp2);
  29. CHECK(1 == product.f()); // NOLINT
  30. CHECK_EQ(11 + 13 + 64, product.e());
  31. // Test rounding.
  32. diy_fp1 = DiyFp(UINT64_2PART_C(0x80000000, 00000001), 11);
  33. diy_fp2 = DiyFp(1, 13);
  34. product = DiyFp::Times(diy_fp1, diy_fp2);
  35. CHECK(1 == product.f()); // NOLINT
  36. CHECK_EQ(11 + 13 + 64, product.e());
  37. diy_fp1 = DiyFp(UINT64_2PART_C(0x7fffffff, ffffffff), 11);
  38. diy_fp2 = DiyFp(1, 13);
  39. product = DiyFp::Times(diy_fp1, diy_fp2);
  40. CHECK(0 == product.f()); // NOLINT
  41. CHECK_EQ(11 + 13 + 64, product.e());
  42. // Halfway cases are allowed to round either way. So don't check for it.
  43. // Big numbers.
  44. diy_fp1 = DiyFp(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF), 11);
  45. diy_fp2 = DiyFp(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF), 13);
  46. // 128bit result: 0xfffffffffffffffe0000000000000001
  47. product = DiyFp::Times(diy_fp1, diy_fp2);
  48. CHECK(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFe) == product.f());
  49. CHECK_EQ(11 + 13 + 64, product.e());
  50. }