| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 f <<= DiyFp::kSignificandSize - kSignificandSize; | 75 f <<= DiyFp::kSignificandSize - kSignificandSize; |
| 76 e -= DiyFp::kSignificandSize - kSignificandSize; | 76 e -= DiyFp::kSignificandSize - kSignificandSize; |
| 77 return DiyFp(f, e); | 77 return DiyFp(f, e); |
| 78 } | 78 } |
| 79 | 79 |
| 80 // Returns the double's bit as uint64. | 80 // Returns the double's bit as uint64. |
| 81 uint64_t AsUint64() const { | 81 uint64_t AsUint64() const { |
| 82 return d64_; | 82 return d64_; |
| 83 } | 83 } |
| 84 | 84 |
| 85 double NextDouble() const { |
| 86 if (d64_ == kInfinity) return kInfinity; |
| 87 return Double(d64_ + 1).value(); |
| 88 } |
| 89 |
| 85 int Exponent() const { | 90 int Exponent() const { |
| 86 if (IsDenormal()) return kDenormalExponent; | 91 if (IsDenormal()) return kDenormalExponent; |
| 87 | 92 |
| 88 uint64_t d64 = AsUint64(); | 93 uint64_t d64 = AsUint64(); |
| 89 int biased_e = | 94 int biased_e = |
| 90 static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize); | 95 static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize); |
| 91 return biased_e - kExponentBias; | 96 return biased_e - kExponentBias; |
| 92 } | 97 } |
| 93 | 98 |
| 94 uint64_t Significand() const { | 99 uint64_t Significand() const { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 113 uint64_t d64 = AsUint64(); | 118 uint64_t d64 = AsUint64(); |
| 114 return (d64 & kExponentMask) == kExponentMask; | 119 return (d64 & kExponentMask) == kExponentMask; |
| 115 } | 120 } |
| 116 | 121 |
| 117 bool IsNan() const { | 122 bool IsNan() const { |
| 118 uint64_t d64 = AsUint64(); | 123 uint64_t d64 = AsUint64(); |
| 119 return ((d64 & kExponentMask) == kExponentMask) && | 124 return ((d64 & kExponentMask) == kExponentMask) && |
| 120 ((d64 & kSignificandMask) != 0); | 125 ((d64 & kSignificandMask) != 0); |
| 121 } | 126 } |
| 122 | 127 |
| 123 | |
| 124 bool IsInfinite() const { | 128 bool IsInfinite() const { |
| 125 uint64_t d64 = AsUint64(); | 129 uint64_t d64 = AsUint64(); |
| 126 return ((d64 & kExponentMask) == kExponentMask) && | 130 return ((d64 & kExponentMask) == kExponentMask) && |
| 127 ((d64 & kSignificandMask) == 0); | 131 ((d64 & kSignificandMask) == 0); |
| 128 } | 132 } |
| 129 | 133 |
| 130 | |
| 131 int Sign() const { | 134 int Sign() const { |
| 132 uint64_t d64 = AsUint64(); | 135 uint64_t d64 = AsUint64(); |
| 133 return (d64 & kSignMask) == 0? 1: -1; | 136 return (d64 & kSignMask) == 0? 1: -1; |
| 134 } | 137 } |
| 135 | 138 |
| 139 DiyFp UpperBoundary() const { |
| 140 return DiyFp(Significand() * 2 + 1, Exponent() - 1); |
| 141 } |
| 136 | 142 |
| 137 // Returns the two boundaries of this. | 143 // Returns the two boundaries of this. |
| 138 // The bigger boundary (m_plus) is normalized. The lower boundary has the same | 144 // The bigger boundary (m_plus) is normalized. The lower boundary has the same |
| 139 // exponent as m_plus. | 145 // exponent as m_plus. |
| 140 void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { | 146 void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { |
| 141 DiyFp v = this->AsDiyFp(); | 147 DiyFp v = this->AsDiyFp(); |
| 142 bool significand_is_zero = (v.f() == kHiddenBit); | 148 bool significand_is_zero = (v.f() == kHiddenBit); |
| 143 DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); | 149 DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); |
| 144 DiyFp m_minus; | 150 DiyFp m_minus; |
| 145 if (significand_is_zero && v.e() != kDenormalExponent) { | 151 if (significand_is_zero && v.e() != kDenormalExponent) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 biased_exponent = static_cast<uint64_t>(exponent + kExponentBias); | 213 biased_exponent = static_cast<uint64_t>(exponent + kExponentBias); |
| 208 } | 214 } |
| 209 return (significand & kSignificandMask) | | 215 return (significand & kSignificandMask) | |
| 210 (biased_exponent << kPhysicalSignificandSize); | 216 (biased_exponent << kPhysicalSignificandSize); |
| 211 } | 217 } |
| 212 }; | 218 }; |
| 213 | 219 |
| 214 } } // namespace v8::internal | 220 } } // namespace v8::internal |
| 215 | 221 |
| 216 #endif // V8_DOUBLE_H_ | 222 #endif // V8_DOUBLE_H_ |
| OLD | NEW |