CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Static Public Member Functions | Static Private Member Functions | Static Private Attributes
MiniFloatConverter Class Reference

#include <libminifloat.h>

Public Member Functions

 MiniFloatConverter ()
 

Static Public Member Functions

static float float16to32 (uint16_t h)
 
static uint16_t float32to16 (float x)
 
static uint16_t float32to16crop (float x)
 Fast implementation, but it crops the number so it biases low. More...
 
static uint16_t float32to16round (float x)
 Slower implementation, but it rounds to avoid biases. More...
 

Static Private Member Functions

static void filltables ()
 

Static Private Attributes

static uint16_t basetable [512]
 
static uint32_t exponenttable [64]
 
static uint32_t mantissatable [2048]
 
static uint16_t offsettable [64]
 
static uint8_t shifttable [512]
 

Detailed Description

Definition at line 7 of file libminifloat.h.

Constructor & Destructor Documentation

MiniFloatConverter::MiniFloatConverter ( )

Definition at line 13 of file libminifloat.cc.

References filltables().

13  {
14  static bool once = false;
15  if (!once) { filltables(); once = true; }
16 }
static void filltables()
Definition: libminifloat.cc:18

Member Function Documentation

void MiniFloatConverter::filltables ( )
staticprivate

Definition at line 18 of file libminifloat.cc.

References basetable, alignCSCRings::e, exponenttable, i, m, mantissatable, offsettable, and shifttable.

Referenced by MiniFloatConverter().

18  {
19  // ==== mantissatable ===
20  // -- zero --
21  mantissatable[0] = 0;
22  // -- denorm --
23  for (unsigned int i = 1; i <= 1023; ++i) {
24  unsigned int m =(i<<13), e=0;
25  while(!(m&0x00800000)){ // While not normalized
26  e-=0x00800000; // Decrement exponent (1<<23)
27  m<<=1; // Shift mantissa
28  }
29  m&=~0x00800000; // Clear leading 1 bit
30  e+= 0x38800000; // Adjust bias ((127-14)<<23)
31  mantissatable[i] = m | e;
32  }
33  // -- norm --
34  for (unsigned int i = 1024; i <= 2047; ++i) {
35  mantissatable[i] = 0x38000000 + ((i-1024)<<13);
36  }
37  // ==== exponenttable ===
38  exponenttable[0] = 0;
39  for (unsigned int i = 1; i <= 30; ++i) exponenttable[i] = i<<23;
40  exponenttable[31] = 0x47800000;
41  exponenttable[32] = 0x80000000u;
42  for (unsigned int i = 33; i <= 62; ++i) exponenttable[i] = 0x80000000u | ((i-32)<<23);
43  exponenttable[63] = 0xC7800000;
44 
45  // ==== offsettable ====
46  for (unsigned int i = 0; i <= 63; ++i) offsettable[i] = ((i == 0 || i == 32) ? 0 : 1024);
47 
48  // ==== basetable, shifttable ===
49  for (unsigned i=0; i<256; ++i){
50  int e = int(i)-127;
51  if(e<-24){ // Very small numbers map to zero
52  basetable[i|0x000]=0x0000;
53  basetable[i|0x100]=0x8000;
54  shifttable[i|0x000]=24;
55  shifttable[i|0x100]=24;
56  }
57  else if(e<-14){ // Small numbers map to denorms
58  basetable[i|0x000]=(0x0400>>(-e-14));
59  basetable[i|0x100]=(0x0400>>(-e-14)) | 0x8000;
60  shifttable[i|0x000]=-e-1;
61  shifttable[i|0x100]=-e-1;
62  }
63  else if(e<=15){ // Normal numbers just lose precision
64  basetable[i|0x000]=((e+15)<<10);
65  basetable[i|0x100]=((e+15)<<10) | 0x8000;
66  shifttable[i|0x000]=13;
67  shifttable[i|0x100]=13;
68  }
69  else if(e<128){ // Large numbers map to Infinity
70  basetable[i|0x000]=0x7C00;
71  basetable[i|0x100]=0xFC00;
72  shifttable[i|0x000]=24;
73  shifttable[i|0x100]=24;
74  }
75  else{ // Infinity and NaN's stay Infinity and NaN's
76  basetable[i|0x000]=0x7C00;
77  basetable[i|0x100]=0xFC00;
78  shifttable[i|0x000]=13;
79  shifttable[i|0x100]=13;
80  }
81  }
82 }
int i
Definition: DBlmapReader.cc:9
static uint16_t offsettable[64]
Definition: libminifloat.h:41
static uint16_t basetable[512]
Definition: libminifloat.h:42
static uint8_t shifttable[512]
Definition: libminifloat.h:43
static uint32_t mantissatable[2048]
Definition: libminifloat.h:39
static uint32_t exponenttable[64]
Definition: libminifloat.h:40
static float MiniFloatConverter::float16to32 ( uint16_t  h)
inlinestatic

Definition at line 10 of file libminifloat.h.

References conv, exponenttable, mantissatable, and offsettable.

Referenced by pat::PackedGenParticle::unpack(), pat::PackedCandidate::unpack(), BeamCurrentInfo::unpackData(), and pat::PackedCandidate::unpackVtx().

10  {
11  union { float flt; uint32_t i32; } conv;
12  conv.i32 = mantissatable[offsettable[h>>10]+(h&0x3ff)]+exponenttable[h>>10];
13  return conv.flt;
14  }
static uint16_t offsettable[64]
Definition: libminifloat.h:41
static HepMC::IO_HEPEVT conv
static uint32_t mantissatable[2048]
Definition: libminifloat.h:39
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
static uint32_t exponenttable[64]
Definition: libminifloat.h:40
static uint16_t MiniFloatConverter::float32to16 ( float  x)
inlinestatic

Definition at line 15 of file libminifloat.h.

References float32to16round().

Referenced by pat::PackedGenParticle::pack(), pat::PackedCandidate::pack(), BeamCurrentInfo::packData(), and pat::PackedCandidate::packVtx().

15  {
16  return float32to16round(x);
17  }
Definition: DDAxes.h:10
static uint16_t float32to16round(float x)
Slower implementation, but it rounds to avoid biases.
Definition: libminifloat.h:25
static uint16_t MiniFloatConverter::float32to16crop ( float  x)
inlinestatic

Fast implementation, but it crops the number so it biases low.

Definition at line 19 of file libminifloat.h.

References basetable, conv, shifttable, and x.

19  {
20  union { float flt; uint32_t i32; } conv;
21  conv.flt = x;
22  return basetable[(conv.i32>>23)&0x1ff]+((conv.i32&0x007fffff)>>shifttable[(conv.i32>>23)&0x1ff]);
23  }
static HepMC::IO_HEPEVT conv
static uint16_t basetable[512]
Definition: libminifloat.h:42
static uint8_t shifttable[512]
Definition: libminifloat.h:43
Definition: DDAxes.h:10
static uint16_t MiniFloatConverter::float32to16round ( float  x)
inlinestatic

Slower implementation, but it rounds to avoid biases.

Definition at line 25 of file libminifloat.h.

References newFWLiteAna::base, compare_using_db::base2, basetable, conv, edm::shift, shifttable, and x.

Referenced by float32to16().

25  {
26  union { float flt; uint32_t i32; } conv;
27  conv.flt = x;
28  uint8_t shift = shifttable[(conv.i32>>23)&0x1ff];
29  if (shift == 13) {
30  uint16_t base2 = (conv.i32&0x007fffff)>>12;
31  uint16_t base = base2 >> 1;
32  if (((base2 & 1) != 0) && (base < 1023)) base++;
33  return basetable[(conv.i32>>23)&0x1ff]+base;
34  } else {
35  return basetable[(conv.i32>>23)&0x1ff]+((conv.i32&0x007fffff)>>shifttable[(conv.i32>>23)&0x1ff]);
36  }
37  }
tuple base
Main Program
Definition: newFWLiteAna.py:92
static HepMC::IO_HEPEVT conv
static uint16_t basetable[512]
Definition: libminifloat.h:42
static uint8_t shifttable[512]
Definition: libminifloat.h:43
static unsigned int const shift
Definition: DDAxes.h:10

Member Data Documentation

uint16_t MiniFloatConverter::basetable
staticprivate

Definition at line 42 of file libminifloat.h.

Referenced by filltables(), float32to16crop(), and float32to16round().

uint32_t MiniFloatConverter::exponenttable
staticprivate

Definition at line 40 of file libminifloat.h.

Referenced by filltables(), and float16to32().

uint32_t MiniFloatConverter::mantissatable
staticprivate

Definition at line 39 of file libminifloat.h.

Referenced by filltables(), and float16to32().

uint16_t MiniFloatConverter::offsettable
staticprivate

Definition at line 41 of file libminifloat.h.

Referenced by filltables(), and float16to32().

uint8_t MiniFloatConverter::shifttable
staticprivate

Definition at line 43 of file libminifloat.h.

Referenced by filltables(), float32to16crop(), and float32to16round().