OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 return kEitherNaN; | 100 return kEitherNaN; |
101 } | 101 } |
102 | 102 |
103 if (lhs_class == Decimal::EncodedData::kClassInfinity) | 103 if (lhs_class == Decimal::EncodedData::kClassInfinity) |
104 return rhs_class == Decimal::EncodedData::kClassInfinity ? kBothInfinity | 104 return rhs_class == Decimal::EncodedData::kClassInfinity ? kBothInfinity |
105 : kLHSIsInfinity; | 105 : kLHSIsInfinity; |
106 | 106 |
107 if (rhs_class == Decimal::EncodedData::kClassInfinity) | 107 if (rhs_class == Decimal::EncodedData::kClassInfinity) |
108 return kRHSIsInfinity; | 108 return kRHSIsInfinity; |
109 | 109 |
110 ASSERT_NOT_REACHED(); | 110 NOTREACHED(); |
111 return kBothFinite; | 111 return kBothFinite; |
112 } | 112 } |
113 | 113 |
114 Decimal SpecialValueHandler::Value() const { | 114 Decimal SpecialValueHandler::Value() const { |
115 switch (result_) { | 115 switch (result_) { |
116 case kResultIsLHS: | 116 case kResultIsLHS: |
117 return lhs_; | 117 return lhs_; |
118 case kResultIsRHS: | 118 case kResultIsRHS: |
119 return rhs_; | 119 return rhs_; |
120 case kResultIsUnknown: | 120 case kResultIsUnknown: |
121 default: | 121 default: |
122 ASSERT_NOT_REACHED(); | 122 NOTREACHED(); |
123 return lhs_; | 123 return lhs_; |
124 } | 124 } |
125 } | 125 } |
126 | 126 |
127 // This class is used for 128 bit unsigned integer arithmetic. | 127 // This class is used for 128 bit unsigned integer arithmetic. |
128 class UInt128 { | 128 class UInt128 { |
129 public: | 129 public: |
130 UInt128(uint64_t low, uint64_t high) : high_(high), low_(low) {} | 130 UInt128(uint64_t low, uint64_t high) : high_(high), low_(low) {} |
131 | 131 |
132 UInt128& operator/=(uint32_t); | 132 UInt128& operator/=(uint32_t); |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 case SpecialValueHandler::kEitherNaN: | 419 case SpecialValueHandler::kEitherNaN: |
420 return handler.Value(); | 420 return handler.Value(); |
421 | 421 |
422 case SpecialValueHandler::kLHSIsInfinity: | 422 case SpecialValueHandler::kLHSIsInfinity: |
423 return rhs.IsZero() ? Nan() : Infinity(result_sign); | 423 return rhs.IsZero() ? Nan() : Infinity(result_sign); |
424 | 424 |
425 case SpecialValueHandler::kRHSIsInfinity: | 425 case SpecialValueHandler::kRHSIsInfinity: |
426 return lhs.IsZero() ? Nan() : Infinity(result_sign); | 426 return lhs.IsZero() ? Nan() : Infinity(result_sign); |
427 } | 427 } |
428 | 428 |
429 ASSERT_NOT_REACHED(); | 429 NOTREACHED(); |
430 return Nan(); | 430 return Nan(); |
431 } | 431 } |
432 | 432 |
433 Decimal Decimal::operator/(const Decimal& rhs) const { | 433 Decimal Decimal::operator/(const Decimal& rhs) const { |
434 const Decimal& lhs = *this; | 434 const Decimal& lhs = *this; |
435 const Sign lhs_sign = lhs.GetSign(); | 435 const Sign lhs_sign = lhs.GetSign(); |
436 const Sign rhs_sign = rhs.GetSign(); | 436 const Sign rhs_sign = rhs.GetSign(); |
437 const Sign result_sign = lhs_sign == rhs_sign ? kPositive : kNegative; | 437 const Sign result_sign = lhs_sign == rhs_sign ? kPositive : kNegative; |
438 | 438 |
439 SpecialValueHandler handler(lhs, rhs); | 439 SpecialValueHandler handler(lhs, rhs); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 return result.IsNegative() ? Decimal(-1) : Decimal(1); | 621 return result.IsNegative() ? Decimal(-1) : Decimal(1); |
622 | 622 |
623 case EncodedData::kClassNaN: | 623 case EncodedData::kClassNaN: |
624 case EncodedData::kClassNormal: | 624 case EncodedData::kClassNormal: |
625 return result; | 625 return result; |
626 | 626 |
627 case EncodedData::kClassZero: | 627 case EncodedData::kClassZero: |
628 return Zero(kPositive); | 628 return Zero(kPositive); |
629 | 629 |
630 default: | 630 default: |
631 ASSERT_NOT_REACHED(); | 631 NOTREACHED(); |
632 return Nan(); | 632 return Nan(); |
633 } | 633 } |
634 } | 634 } |
635 | 635 |
636 // Round toward negative infinity. | 636 // Round toward negative infinity. |
637 Decimal Decimal::Floor() const { | 637 Decimal Decimal::Floor() const { |
638 if (IsSpecial()) | 638 if (IsSpecial()) |
639 return *this; | 639 return *this; |
640 | 640 |
641 if (Exponent() >= 0) | 641 if (Exponent() >= 0) |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 number_of_digits = 1; | 822 number_of_digits = 1; |
823 state = kStateDigit; | 823 state = kStateDigit; |
824 break; | 824 break; |
825 } | 825 } |
826 | 826 |
827 HandleCharAndBreak('.', kStateDot); | 827 HandleCharAndBreak('.', kStateDot); |
828 HandleTwoCharsAndBreak('E', 'e', kStateE); | 828 HandleTwoCharsAndBreak('E', 'e', kStateE); |
829 return Nan(); | 829 return Nan(); |
830 | 830 |
831 default: | 831 default: |
832 ASSERT_NOT_REACHED(); | 832 NOTREACHED(); |
833 return Nan(); | 833 return Nan(); |
834 } | 834 } |
835 } | 835 } |
836 | 836 |
837 if (state == kStateZero) | 837 if (state == kStateZero) |
838 return Zero(sign); | 838 return Zero(sign); |
839 | 839 |
840 if (state == kStateDigit || state == kStateEDigit || | 840 if (state == kStateDigit || state == kStateEDigit || |
841 state == kStateDotDigit) { | 841 state == kStateDotDigit) { |
842 int result_exponent = exponent * (exponent_sign == kNegative ? -1 : 1) - | 842 int result_exponent = exponent * (exponent_sign == kNegative ? -1 : 1) - |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 return GetSign() ? "-Infinity" : "Infinity"; | 915 return GetSign() ? "-Infinity" : "Infinity"; |
916 | 916 |
917 case EncodedData::kClassNaN: | 917 case EncodedData::kClassNaN: |
918 return "NaN"; | 918 return "NaN"; |
919 | 919 |
920 case EncodedData::kClassNormal: | 920 case EncodedData::kClassNormal: |
921 case EncodedData::kClassZero: | 921 case EncodedData::kClassZero: |
922 break; | 922 break; |
923 | 923 |
924 default: | 924 default: |
925 ASSERT_NOT_REACHED(); | 925 NOTREACHED(); |
926 return ""; | 926 return ""; |
927 } | 927 } |
928 | 928 |
929 StringBuilder builder; | 929 StringBuilder builder; |
930 if (GetSign()) | 930 if (GetSign()) |
931 builder.Append('-'); | 931 builder.Append('-'); |
932 | 932 |
933 int original_exponent = Exponent(); | 933 int original_exponent = Exponent(); |
934 uint64_t coefficient = data_.Coefficient(); | 934 uint64_t coefficient = data_.Coefficient(); |
935 | 935 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 Decimal::EncodedData data = decimal.Value(); | 1001 Decimal::EncodedData data = decimal.Value(); |
1002 return ostream << "encode(" | 1002 return ostream << "encode(" |
1003 << String::Number(data.Coefficient()).Ascii().data() << ", " | 1003 << String::Number(data.Coefficient()).Ascii().data() << ", " |
1004 << String::Number(data.Exponent()).Ascii().data() << ", " | 1004 << String::Number(data.Exponent()).Ascii().data() << ", " |
1005 << (data.GetSign() == Decimal::kNegative ? "Negative" | 1005 << (data.GetSign() == Decimal::kNegative ? "Negative" |
1006 : "Positive") | 1006 : "Positive") |
1007 << ")=" << decimal.ToString().Ascii().data(); | 1007 << ")=" << decimal.ToString().Ascii().data(); |
1008 } | 1008 } |
1009 | 1009 |
1010 } // namespace blink | 1010 } // namespace blink |
OLD | NEW |