1 // cl_LF_shortenrelative().
12 #include "cln/exception.h"
14 #include "cl_inline2.h"
15 #include "cl_LF_precision.cc"
16 #include "cl_inline.h"
17 #include "cl_LF_exponent.cc"
21 const cl_LF cl_LF_shortenrelative (const cl_LF& x, const cl_LF& y)
24 // x = 0.0 -> Precision egal, return x.
25 // ex := float_exponent(x), ey := float_exponent(y).
26 // dx := float_digits(x), dy := float_digits(y).
27 // 1 ulp(x) = 2^(ex-dx), 1 ulp(y) = 2^(ey-dy).
28 // Falls ex-dx < ey-dy, x von Precision dx auf dy-ey+ex verkürzen.
29 var sintE ey = float_exponent_inline(y);
30 var sintC dy = float_precision_inline(y);
31 if (dy==0) // zerop(y) ?
32 throw runtime_exception();
33 var sintE ex = float_exponent_inline(x);
34 var sintC dx = float_precision_inline(x);
35 if (dx==0) // zerop(x) ?
37 var sintE d = ex - ey;
38 if (ex>=0 && ey<0 && d<0) // d overflow?
40 if (ex<0 && ey>=0 && d>=0) // d underflow?
41 return LF_to_LF(x,LF_minlen);
44 var uintC new_dx = dy + d;
45 var uintC len = ceiling(new_dx,intDsize);
48 if (intDsize*len < (uintC)dx)
49 return shorten(x,len);