53 lines
1.3 KiB

// scale_float().
// General includes.
#include "cl_sysdep.h"
// Specification.
#include "cln/ffloat.h"
// Implementation.
#include "cl_FF.h"
#include "cl_F.h"
namespace cln {
const cl_FF scale_float (const cl_FF& x, sintC delta)
{
// Methode:
// x=0.0 -> x als Ergebnis
// delta muß betragsmäßig <= FF_exp_high-FF_exp_low sein.
// Neues FF mit um delta vergrößertem Exponenten bilden.
// x entpacken:
var cl_signean sign;
var sintL exp;
var uint32 mant;
FF_decode(x, { return x; }, sign=,exp=,mant=);
if (delta >= 0)
// delta>=0
{ var uintC udelta = delta;
if (udelta <= (uintL)(FF_exp_high-FF_exp_low))
{ exp = exp+udelta;
return encode_FF(sign,exp,mant);
}
else
{ throw floating_point_overflow_exception(); }
}
else
// delta<0
{ var uintC udelta = -delta;
if (udelta <= (uintL)(FF_exp_high-FF_exp_low))
{ exp = exp-udelta;
return encode_FF(sign,exp,mant);
}
else
if (underflow_allowed())
{ throw floating_point_underflow_exception(); }
else
{ return cl_FF_0; }
}
}
} // namespace cln