text: /*
  
   Copyright (c) 2013 IETF Trust and the persons identified as the
   document authors.  All rights reserved.
  
   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.
  
   */
  
  /*
   This code is from RFC 7049. It is not used in the main implementation
   because:
     a) it adds a dependency on <math.h> and ldexp().
     b) the license may be an issue
  
   QCBOR does support half-precision, but rather than using
   floating-point math like this, it does it with bit shifting
   and masking.
  
   This code is here to test that code.
  
   */
  
  #include "half_to_double_from_rfc7049.h"
  
  #include <math.h>
  
  double decode_half(unsigned char *halfp) {
      int half = (halfp[0] << 8) + halfp[1];
      int exp = (half >> 10) & 0x1f;
      int mant = half & 0x3ff;
      double val;
      if (exp == 0) val = ldexp(mant, -24);
      else if (exp != 31) val = ldexp(mant + 1024, exp - 25);
      else val = mant == 0 ? INFINITY : NAN;
      return half & 0x8000 ? -val : val;
  }
  