// ftruncate().
// General includes.
#include "cl_sysdep.h"
// Specification.
#include "cln/dfloat.h"
// Implementation.
#include "cl_DF.h"
namespace cln {
const cl_DF ftruncate (const cl_DF& x)
{
// Methode:
// x = 0.0 oder e<=0 -> Ergebnis 0.0
// 1<=e<=52 -> letzte (53-e) Bits der Mantisse auf 0 setzen,
// Exponent und Vorzeichen beibehalten
// e>=53 -> Ergebnis x
#if (cl_word_size==64)
var dfloat x_ = TheDfloat(x)->dfloat_value;
var uintL uexp = DF_uexp(x_); // e + DF_exp_mid
if (uexp <= DF_exp_mid) // 0.0 oder e<=0 ?
{ return cl_DF_0; }
else
{ if (uexp > DF_exp_mid+DF_mant_len) // e > 52 ?
{ return x; }
else
// 1<=e<=52
{ return allocate_dfloat
( x_ & // Bitmaske: Bits 52-e..0 gelöscht, alle anderen gesetzt
~(bit(DF_mant_len+1+DF_exp_mid-uexp)-1)
);
} }
#else
var uint32 semhi = TheDfloat(x)->dfloat_value.semhi;
var uint32 mlo = TheDfloat(x)->dfloat_value.mlo;
var uintL uexp = DF_uexp(semhi); // e + DF_exp_mid
if (uexp <= DF_exp_mid) // 0.0 oder e<=0 ?
{ return cl_DF_0; }
else
{ if (uexp > DF_exp_mid+DF_mant_len) // e > 52 ?
{ return x; }
else
// 1<=e<=52
if (uexp > DF_exp_mid+DF_mant_len+1-32) // e > 21 ?
{ return allocate_dfloat
( semhi,
mlo & // Bitmaske: Bits 52-e..0 gelöscht, alle anderen gesetzt
~(bit(DF_mant_len+1+DF_exp_mid-uexp)-1)
);
}
else
{ return allocate_dfloat
( semhi & // Bitmaske: Bits 20-e..0 gelöscht, alle anderen gesetzt
~(bit(DF_mant_len+1+DF_exp_mid-32-uexp)-1),
0
);
} }
#endif
}
} // namespace cln
syntax highlighted by Code2HTML, v. 0.9.1