// cl_FF_to_float().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cln/ffloat.h"


// Implementation.

#include "cl_FF.h"

namespace cln {

float float_approx (const cl_FF& obj)
{
	union { ffloat eksplicit; float machine_float; } u;
	#define val u.eksplicit
	val = cl_ffloat_value(obj);
	// Der Exponent muß um FF_exp_mid-126 erniedrigt werden.
	if (FF_exp_mid>126)
	  { var uintL exp = (val >> FF_mant_len) & (bit(FF_exp_len)-1); // e
	    if (exp < FF_exp_mid-126+1)
	      { // produziere denormalisiertes Float
	        val = (val & minus_bit(FF_exp_len+FF_mant_len)) // selbes Vorzeichen
	              | (0 << FF_mant_len) // Exponent 0
	              | (((val & (bit(FF_mant_len)-1)) | bit(FF_mant_len)) // Mantisse shiften
	                 >> (FF_exp_mid-126+1 - exp) // shiften
	                );
	      }
	      else
	      { val -= (FF_exp_mid - 126) << FF_mant_len; }
	  }
	#undef val
	return u.machine_float;
}

}  // namespace cln


syntax highlighted by Code2HTML, v. 0.9.1