1  // Copyright 2018 Ulf Adams
       2  //
       3  // The contents of this file may be used under the terms of the Apache License,
       4  // Version 2.0.
       5  //
       6  //    (See accompanying file LICENSE-Apache or copy at
       7  //     http://www.apache.org/licenses/LICENSE-2.0)
       8  //
       9  // Alternatively, the contents of this file may be used under the terms of
      10  // the Boost Software License, Version 1.0.
      11  //    (See accompanying file LICENSE-Boost or copy at
      12  //     https://www.boost.org/LICENSE_1_0.txt)
      13  //
      14  // Unless required by applicable law or agreed to in writing, this software
      15  // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      16  // KIND, either express or implied.
      17  #ifndef RYU_GENERIC_128_H
      18  #define RYU_GENERIC_128_H
      19  
      20  
      21  // NOTE: These symbols are declared extern "C" upstream, but we don't want that
      22  // because it'd override the internal linkage of the anonymous namespace into
      23  // which this header is included.
      24  
      25  // This is a generic 128-bit implementation of float to shortest conversion
      26  // using the Ryu algorithm. It can handle any IEEE-compatible floating-point
      27  // type up to 128 bits. In order to use this correctly, you must use the
      28  // appropriate *_to_fd128 function for the underlying type - DO NOT CAST your
      29  // input to another floating-point type, doing so will result in incorrect
      30  // output!
      31  //
      32  // For any floating-point type that is not natively defined by the compiler,
      33  // you can use generic_binary_to_decimal to work directly on the underlying bit
      34  // representation.
      35  
      36  #define FD128_EXCEPTIONAL_EXPONENT 0x7FFFFFFF
      37  
      38  // A floating decimal representing (-1)^s * m * 10^e.
      39  struct floating_decimal_128 {
      40    uint128_t mantissa;
      41    int32_t exponent;
      42    bool sign;
      43  };
      44  
      45  // Converts the given decimal floating point number to a string, writing to result, and returning
      46  // the number characters written. Does not terminate the buffer with a 0. In the worst case, this
      47  // function can write up to 53 characters.
      48  //
      49  // Maximal char buffer requirement:
      50  // sign + mantissa digits + decimal dot + 'E' + exponent sign + exponent digits
      51  // = 1 + 39 + 1 + 1 + 1 + 10 = 53
      52  int generic_to_chars(const struct floating_decimal_128 v, char* const result);
      53  
      54  
      55  #endif // RYU_GENERIC_128_H