PageRenderTime 19ms CodeModel.GetById 8ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/src/FreeImage/Source/OpenEXR/Half/toFloat.cpp

https://bitbucket.org/cabalistic/ogredeps/
C++ | 164 lines | 65 code | 30 blank | 69 comment | 14 complexity | 24afbf33ae9ba2c95b762924da158a41 MD5 | raw file
  1///////////////////////////////////////////////////////////////////////////
  2//
  3// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
  4// Digital Ltd. LLC
  5// 
  6// All rights reserved.
  7// 
  8// Redistribution and use in source and binary forms, with or without
  9// modification, are permitted provided that the following conditions are
 10// met:
 11// *       Redistributions of source code must retain the above copyright
 12// notice, this list of conditions and the following disclaimer.
 13// *       Redistributions in binary form must reproduce the above
 14// copyright notice, this list of conditions and the following disclaimer
 15// in the documentation and/or other materials provided with the
 16// distribution.
 17// *       Neither the name of Industrial Light & Magic nor the names of
 18// its contributors may be used to endorse or promote products derived
 19// from this software without specific prior written permission. 
 20// 
 21// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 22// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 23// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 24// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 25// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 26// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 27// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 28// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 29// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 30// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 31// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 32//
 33///////////////////////////////////////////////////////////////////////////
 34
 35
 36
 37
 38//---------------------------------------------------------------------------
 39//
 40//	toFloat
 41//
 42//	A program to generate the lookup table for half-to-float
 43//	conversion needed by class half.
 44//	The program loops over all 65536 possible half numbers,
 45//	converts each of them to a float, and prints the result.
 46//
 47//---------------------------------------------------------------------------
 48
 49
 50#include <iostream>
 51#include <iomanip>
 52
 53using namespace std;
 54
 55//---------------------------------------------------
 56// Interpret an unsigned short bit pattern as a half,
 57// and convert that half to the corresponding float's
 58// bit pattern.
 59//---------------------------------------------------
 60
 61unsigned int
 62halfToFloat (unsigned short y)
 63{
 64
 65    int s = (y >> 15) & 0x00000001;
 66    int e = (y >> 10) & 0x0000001f;
 67    int m =  y        & 0x000003ff;
 68
 69    if (e == 0)
 70    {
 71	if (m == 0)
 72	{
 73	    //
 74	    // Plus or minus zero
 75	    //
 76
 77	    return s << 31;
 78	}
 79	else
 80	{
 81	    //
 82	    // Denormalized number -- renormalize it
 83	    //
 84
 85	    while (!(m & 0x00000400))
 86	    {
 87		m <<= 1;
 88		e -=  1;
 89	    }
 90
 91	    e += 1;
 92	    m &= ~0x00000400;
 93	}
 94    }
 95    else if (e == 31)
 96    {
 97	if (m == 0)
 98	{
 99	    //
100	    // Positive or negative infinity
101	    //
102
103	    return (s << 31) | 0x7f800000;
104	}
105	else
106	{
107	    //
108	    // Nan -- preserve sign and significand bits
109	    //
110
111	    return (s << 31) | 0x7f800000 | (m << 13);
112	}
113    }
114
115    //
116    // Normalized number
117    //
118
119    e = e + (127 - 15);
120    m = m << 13;
121
122    //
123    // Assemble s, e and m.
124    //
125
126    return (s << 31) | (e << 23) | m;
127}
128
129
130//---------------------------------------------
131// Main - prints the half-to-float lookup table
132//---------------------------------------------
133
134int
135main ()
136{
137    cout.precision (9);
138    cout.setf (ios_base::hex, ios_base::basefield);
139
140    cout << "//\n"
141	    "// This is an automatically generated file.\n"
142	    "// Do not edit.\n"
143	    "//\n\n";
144
145    cout << "{\n    ";
146
147    const int iMax = (1 << 16);
148
149    for (int i = 0; i < iMax; i++)
150    {
151	cout << "{0x" << setfill ('0') << setw (8) << halfToFloat (i) << "}, ";
152
153	if (i % 4 == 3)
154	{
155	    cout << "\n";
156
157	    if (i < iMax - 1)
158		cout << "    ";
159	}
160    }
161
162    cout << "};\n";
163    return 0;
164}