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 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 } | 605 } |
606 } | 606 } |
607 | 607 |
608 AlignedOperands alignedOperands; | 608 AlignedOperands alignedOperands; |
609 alignedOperands.exponent = exponent; | 609 alignedOperands.exponent = exponent; |
610 alignedOperands.lhsCoefficient = lhsCoefficient; | 610 alignedOperands.lhsCoefficient = lhsCoefficient; |
611 alignedOperands.rhsCoefficient = rhsCoefficient; | 611 alignedOperands.rhsCoefficient = rhsCoefficient; |
612 return alignedOperands; | 612 return alignedOperands; |
613 } | 613 } |
614 | 614 |
| 615 static bool isMultiplePowersOfTen(uint64_t coefficient, int n) |
| 616 { |
| 617 return !coefficient || !(coefficient % scaleUp(1, n)); |
| 618 } |
| 619 |
615 // Round toward positive infinity. | 620 // Round toward positive infinity. |
616 // Note: Mac ports defines ceil(x) as wtf_ceil(x), so we can't use name "ceil" h
ere. | 621 // Note: Mac ports defines ceil(x) as wtf_ceil(x), so we can't use name "ceil" h
ere. |
617 Decimal Decimal::ceiling() const | 622 Decimal Decimal::ceiling() const |
618 { | 623 { |
619 if (isSpecial()) | 624 if (isSpecial()) |
620 return *this; | 625 return *this; |
621 | 626 |
622 if (exponent() >= 0) | 627 if (exponent() >= 0) |
623 return *this; | 628 return *this; |
624 | 629 |
625 uint64_t result = m_data.coefficient(); | 630 uint64_t result = m_data.coefficient(); |
626 const int numberOfDigits = countDigits(result); | 631 const int numberOfDigits = countDigits(result); |
627 const int numberOfDropDigits = -exponent(); | 632 const int numberOfDropDigits = -exponent(); |
628 if (numberOfDigits < numberOfDropDigits) | 633 if (numberOfDigits < numberOfDropDigits) |
629 return isPositive() ? Decimal(1) : zero(Positive); | 634 return isPositive() ? Decimal(1) : zero(Positive); |
630 | 635 |
631 result = scaleDown(result, numberOfDropDigits - 1); | 636 result = scaleDown(result, numberOfDropDigits); |
632 if (sign() == Positive && result % 10 > 0) | 637 if (isPositive() && !isMultiplePowersOfTen(m_data.coefficient(), numberOfDro
pDigits)) |
633 result += 10; | 638 ++result; |
634 result /= 10; | |
635 return Decimal(sign(), 0, result); | 639 return Decimal(sign(), 0, result); |
636 } | 640 } |
637 | 641 |
638 Decimal Decimal::compareTo(const Decimal& rhs) const | 642 Decimal Decimal::compareTo(const Decimal& rhs) const |
639 { | 643 { |
640 const Decimal result(*this - rhs); | 644 const Decimal result(*this - rhs); |
641 switch (result.m_data.formatClass()) { | 645 switch (result.m_data.formatClass()) { |
642 case EncodedData::ClassInfinity: | 646 case EncodedData::ClassInfinity: |
643 return result.isNegative() ? Decimal(-1) : Decimal(1); | 647 return result.isNegative() ? Decimal(-1) : Decimal(1); |
644 | 648 |
(...skipping 18 matching lines...) Expand all Loading... |
663 | 667 |
664 if (exponent() >= 0) | 668 if (exponent() >= 0) |
665 return *this; | 669 return *this; |
666 | 670 |
667 uint64_t result = m_data.coefficient(); | 671 uint64_t result = m_data.coefficient(); |
668 const int numberOfDigits = countDigits(result); | 672 const int numberOfDigits = countDigits(result); |
669 const int numberOfDropDigits = -exponent(); | 673 const int numberOfDropDigits = -exponent(); |
670 if (numberOfDigits < numberOfDropDigits) | 674 if (numberOfDigits < numberOfDropDigits) |
671 return isPositive() ? zero(Positive) : Decimal(-1); | 675 return isPositive() ? zero(Positive) : Decimal(-1); |
672 | 676 |
673 result = scaleDown(result, numberOfDropDigits - 1); | 677 result = scaleDown(result, numberOfDropDigits); |
674 if (isNegative() && result % 10 > 0) | 678 if (isNegative() && !isMultiplePowersOfTen(m_data.coefficient(), numberOfDro
pDigits)) |
675 result += 10; | 679 ++result; |
676 result /= 10; | |
677 return Decimal(sign(), 0, result); | 680 return Decimal(sign(), 0, result); |
678 } | 681 } |
679 | 682 |
680 Decimal Decimal::fromDouble(double doubleValue) | 683 Decimal Decimal::fromDouble(double doubleValue) |
681 { | 684 { |
682 if (std::isfinite(doubleValue)) | 685 if (std::isfinite(doubleValue)) |
683 return fromString(String::numberToStringECMAScript(doubleValue)); | 686 return fromString(String::numberToStringECMAScript(doubleValue)); |
684 | 687 |
685 if (std::isinf(doubleValue)) | 688 if (std::isinf(doubleValue)) |
686 return infinity(doubleValue < 0 ? Negative : Positive); | 689 return infinity(doubleValue < 0 ? Negative : Positive); |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 } | 1028 } |
1026 return builder.toString(); | 1029 return builder.toString(); |
1027 } | 1030 } |
1028 | 1031 |
1029 Decimal Decimal::zero(Sign sign) | 1032 Decimal Decimal::zero(Sign sign) |
1030 { | 1033 { |
1031 return Decimal(EncodedData(sign, EncodedData::ClassZero)); | 1034 return Decimal(EncodedData(sign, EncodedData::ClassZero)); |
1032 } | 1035 } |
1033 | 1036 |
1034 } // namespace WebCore | 1037 } // namespace WebCore |
OLD | NEW |