arduino-audio-tools
Float16.h
1 #pragma once
2 
3 namespace audio_tools {
4 
11 class float16 {
12  public:
13  float16() = default;
14  float16(float in){
15  this->value = float16::float_to_half(in);
16  }
17  float16(const float16 &value16){
18  this->value = value16.value;
19  }
20  inline operator float() {
21  return half_to_float(value);
22  }
23  explicit inline operator double() {
24  return (double) float16::half_to_float(value);
25  }
26  explicit inline operator int() {
27  return (int) float16::half_to_float(value);
28  }
29  explicit inline operator int() const {
30  return (int) float16::half_to_float(value);
31  }
32  inline bool operator< (float16 other) const{
33  return float() < (float)other;
34  }
35  inline bool operator<= (float16 other) const{
36  return float() <= (float)other;
37  }
38  inline bool operator> (float16 other) const{
39  return float() > (float)other;
40  }
41  inline bool operator>= (float16 other) const{
42  return float() >= (float)other;
43  }
44  inline bool operator== (float16 other) const{
45  return float() == (float)other;
46  }
47  inline bool operator!= (float16 other) const{
48  return float() != (float)other;
49  }
50 
51 
52  protected:
53  uint16_t value=0;
54 
56  static uint32_t as_uint(const float x) {
57  return *(uint*)&x;
58  }
60  static float as_float(const uint32_t x) {
61  return *(float*)&x;
62  }
63 
65  static float half_to_float(const uint16_t x) { // IEEE-754 16-bit floating-point format (without infinity): 1-5-10, exp-15, +-131008.0, +-6.1035156E-5, +-5.9604645E-8, 3.311 digits
66  const uint32_t e = (x&0x7C00)>>10; // exponent
67  const uint32_t m = (x&0x03FF)<<13; // mantissa
68  const uint32_t v = as_uint((float)m)>>23; // evil log2 bit hack to count leading zeros in denormalized format
69  return as_float((x&0x8000)<<16 | (e!=0)*((e+112)<<23|m) | ((e==0)&(m!=0))*((v-37)<<23|((m<<(150-v))&0x007FE000))); // sign : normalized : denormalized
70  }
72  static uint16_t float_to_half(const float x) { // IEEE-754 16-bit floating-point format (without infinity): 1-5-10, exp-15, +-131008.0, +-6.1035156E-5, +-5.9604645E-8, 3.311 digits
73  const uint32_t b = as_uint(x)+0x00001000; // round-to-nearest-even: add last bit after truncated mantissa
74  const uint32_t e = (b&0x7F800000)>>23; // exponent
75  const uint32_t m = b&0x007FFFFF; // mantissa; in line below: 0x007FF000 = 0x00800000-0x00001000 = decimal indicator flag - initial rounding
76  return (b&0x80000000)>>16 | (e>112)*((((e-112)<<10)&0x7C00)|m>>13) | ((e<113)&(e>101))*((((0x007FF000+m)>>(125-e))+1)>>1) | (e>143)*0x7FFF; // sign : normalized : denormalized : saturate
77  }
78 
79 };
80 
81 inline float operator+ (float16 one, float16 two)
82 {
83  return (float)one + (float)two;
84 }
85 inline float operator- (float16 one, float16 two)
86 {
87  return (float)one - (float)two;
88 }
89 inline float operator* (float16 one, float16 two)
90 {
91  return (float)one * (float)two;
92 }
93 inline float operator/ (float16 one, float16 two)
94 {
95  return (float)one / (float)two;
96 }
97 inline float operator+ (float16 one, float two)
98 {
99  return (float)one + two;
100 }
101 inline float operator- (float16 one, float two)
102 {
103  return (float)one - two;
104 }
105 inline float operator* (float16 one, float two)
106 {
107  return (float)one * two;
108 }
109 inline float operator/ (float16 one, float two)
110 {
111  return (float)one / two;
112 }
113 inline float operator+ (float one, float16 two)
114 {
115  return two + float(one);
116 }
117 inline float operator- (float one, float16 two)
118 {
119  return two - float(one);
120 }
121 inline float operator* (float one, float16 two)
122 {
123  return two * float(one);
124 }
125 inline float operator/ (float one, float16 two)
126 {
127  return two / float(one);
128 }
129 
130 }
131 
132 namespace std {
133 
134 inline float floor ( float16 arg ) { return std::floor((float)arg);}
135 inline float fabs ( float16 arg ) { return std::fabs((float)arg);}
136 
137 }
Stores float values with 2 bytes.
Definition: Float16.h:11
static float half_to_float(const uint16_t x)
see https://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion
Definition: Float16.h:65
static uint32_t as_uint(const float x)
see https://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion
Definition: Float16.h:56
static float as_float(const uint32_t x)
see https://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion
Definition: Float16.h:60
static uint16_t float_to_half(const float x)
see https://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion
Definition: Float16.h:72
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10