Lines Matching +full:zero +full:- +full:point

1 //===-- lib/Decimal/decimal-to-binary.cpp ---------------------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "big-radix-floating-point.h"
10 #include "flang/Common/bit-population-count.h"
11 #include "flang/Common/leading-zero-bit-count.h"
12 #include "flang/Decimal/binary-floating-point.h"
14 #include "flang/Runtime/freestanding-tools.h"
39 isNegative_ = *q == '-'; in ParseNumber()
40 if (*q == '-' || *q == '+') { in ParseNumber()
49 const char *point{nullptr}; in ParseNumber() local
51 point = q; in ParseNumber()
55 if (q == start || (q == start + 1 && start == point)) { in ParseNumber()
58 // There's a valid number here; set the reference argument to point to in ParseNumber()
62 if (point) { in ParseNumber()
63 while (q[-1] == '0') { in ParseNumber()
64 --q; in ParseNumber()
66 if (q[-1] == '.') { in ParseNumber()
67 point = nullptr; in ParseNumber()
68 --q; in ParseNumber()
71 if (!point) { in ParseNumber()
72 while (q > firstDigit && q[-1] == '0') { in ParseNumber()
73 --q; in ParseNumber()
78 const char *limit{firstDigit + maxDigits * log10Radix + (point != nullptr)}; in ParseNumber()
81 if (point >= limit) { in ParseNumber()
82 q = point; in ParseNumber()
83 point = nullptr; in ParseNumber()
85 if (!point) { in ParseNumber()
86 exponent_ += q - limit; in ParseNumber()
90 if (point) { in ParseNumber()
91 exponent_ -= static_cast<int>(q - point - 1); in ParseNumber()
97 for (auto times{radix}; q-- > firstDigit;) { in ParseNumber()
100 digit_[digits_++] = *q - '0'; in ParseNumber()
103 digit_[digits_ - 1] += times * (*q - '0'); in ParseNumber()
123 bool negExpo{*q == '-'}; in ParseNumber()
124 if (*q == '-' || *q == '+') { in ParseNumber()
133 expo = 10 * expo + *q - '0'; in ParseNumber()
137 // The decimal->binary conversion routine will cope with in ParseNumber()
145 exponent_ -= expo; in ParseNumber()
161 for (int j{0}; j < digits_ - 1; ++j) { in LoseLeastSignificantDigit()
164 digit_[digits_ - 1] = 0; in LoseLeastSignificantDigit()
188 // binary floating-point value with an unbiased (i.e., signed)
190 // binary point to its *right*, and some guard bits for rounding.
195 static constexpr IntType topBit{IntType{1} << (precision - 1)};
196 static constexpr IntType mask{topBit + (topBit - 1)};
210 int shift{common::BitsNeededFor(n) - precision}; in SetTo()
218 n <<= nBits - shift; in SetTo()
219 guard_ = (n >> (nBits - guardBits)) | ((n << guardBits) != 0); in SetTo()
229 guard_ |= (static_cast<GuardType>(g & 6) << (guardBits - 3)) | (g & 1); in SetGuard()
238 static constexpr GuardType oneHalf{GuardType{1} << (guardBits - 1)};
246 // numbers, and some popular compilers interpret that to mean +/-HUGE()
247 // rather than +/-Inf.
258 // Create a fraction with a binary point to the left of the integer in ToBinary()
262 int expo{exponent_ + Binary::exponentBias + (precision - 1)}; in ToBinary()
265 ((static_cast<GuardType>(fraction) & 1) << (guardBits - 1)); in ToBinary()
279 } else { // round to zero in ToBinary()
283 Binary zero; in ToBinary() local
285 zero.Negate(); in ToBinary()
288 std::move(zero), static_cast<enum ConversionResultFlags>(flags)}; in ToBinary()
294 --expo; in ToBinary()
295 fraction = fraction * 2 + (guard >> (guardBits - 2)); in ToBinary()
297 (((guard >> (guardBits - 2)) & 1) << (guardBits - 1)) | (guard & 1); in ToBinary()
334 expo = Binary::maxExponent - 1; in ToBinary()
347 Raw raw = static_cast<Raw>(isNegative) << (Binary::bits - 1); in ToBinary()
359 // On entry, *this holds a multi-precision integer value in a radix of a in ConvertToBinary()
360 // large power of ten. Its radix point is defined to be to the right of its in ConvertToBinary()
363 if (digits_ == 0) { // zero value in ConvertToBinary()
366 // The value is not zero: x = D. * 10.**E in ConvertToBinary()
367 // Shift our perspective on the radix (& decimal) point so that in ConvertToBinary()
372 if (exponent_ < -crazy) { in ConvertToBinary()
380 } else { // underflow to +/-0. in ConvertToBinary()
383 } else if (exponent_ > crazy) { // overflow to +/-HUGE() or +/-Inf in ConvertToBinary()
394 // x = 0.D * 10.**E * 2.**(f.ex) -> 512 * 0.D * 10.**E * 2.**(f.ex-9) in ConvertToBinary()
395 f.AdjustExponent(-9); in ConvertToBinary()
398 // x = c.D * 10.**E * 2.**(f.ex) -> .cD * 10.**(E+16) * 2.**(f.ex) in ConvertToBinary()
410 // x = 0.D * 10.**E * 2.**(f.ex) -> 625 * .D * 10.**(E-4) * 2.**(f.ex+4) in ConvertToBinary()
411 exponent_ -= 4; in ConvertToBinary()
415 // x = 0.D * 10.**E * 2.**(f.ex) -> 5 * .D * 10.**(E-1) * 2.**(f.ex+1) in ConvertToBinary()
416 --exponent_; in ConvertToBinary()
421 // x = c.D * 10.**E * 2.**(f.ex) -> .cD * 10.**(E+16) * 2.**(f.ex) in ConvertToBinary()
429 // x = .jD * 10.**16 * 2.**(f.ex) -> .D * j * 2.**(f.ex) in ConvertToBinary()
430 int guardShift{f.SetTo(digit_[--digits_])}; in ConvertToBinary()
434 // x = ((b.D)/2) * j * 2.**(f.ex) -> .D * (2j + b) * 2.**(f.ex-1) in ConvertToBinary()
435 f.AdjustExponent(-1); in ConvertToBinary()
465 // Could not parse a decimal floating-point number. p has been in ConvertToBinary()
467 // the sign bit for -NaN. in ConvertToBinary()
470 isNegative_ = *q == '-'; in ConvertToBinary()
490 --depth; in ConvertToBinary()