var const cl_I& b = denominator(x); // b
var cl_signean sign = -(cl_signean)minusp(a); // Vorzeichen
if (!(sign==0)) { a = -a; } // Betrag nehmen, liefert a
- var sintL lendiff = (sintL)integer_length(a) // (integer-length a)
- - (sintL)integer_length(b); // (integer-length b)
+ var sintC lendiff = (sintC)integer_length(a) // (integer-length a)
+ - (sintC)integer_length(b); // (integer-length b)
if (lendiff > DF_exp_high-DF_exp_mid) // Exponent >= n-m > Obergrenze ?
- { cl_error_floating_point_overflow(); } // -> Overflow
+ { throw floating_point_overflow_exception(); } // -> Overflow
if (lendiff < DF_exp_low-DF_exp_mid-2) // Exponent <= n-m+2 < Untergrenze ?
{ if (underflow_allowed())
- { cl_error_floating_point_underflow(); } // -> Underflow
+ { throw floating_point_underflow_exception(); } // -> Underflow
else
{ return cl_DF_0; }
}
var cl_I_div_t q_r = cl_divide(zaehler,nenner);
var cl_I& q = q_r.quotient;
var cl_I& r = q_r.remainder;
- // 2^53 <= q < 2^55, also ist q Bignum mit ceiling(55/intDsize) Digits.
- var const uintD* ptr = BN_MSDptr(q);
#if (cl_word_size==64)
+ #if (cl_value_len>=55)
+ // 2^53 <= q < 2^55: q is fixnum.
+ var uint64 mant = FN_to_UV(q);
+ #else
+ // 2^53 <= q < 2^55: q is bignum with one Digit.
+ var const uintD* ptr = BN_MSDptr(q);
var uint64 mant = get_max64_Dptr(55,ptr);
+ #endif
if (mant >= bit(DF_mant_len+2))
// 2^54 <= q < 2^55, schiebe um 2 Bits nach rechts
{ var uint64 rounding_bits = mant & (bit(2)-1);
ab:
// Fertig.
return encode_DF(sign,lendiff,mant);
- #else
+ #else // (cl_word_size<64)
+ // 2^53 <= q < 2^55: q is bignum with two Digits.
+ var const uintD* ptr = BN_MSDptr(q);
var uint32 manthi = get_max32_Dptr(23,ptr);
var uint32 mantlo = get_32_Dptr(ptr mspop ceiling(23,intDsize));
if (manthi >= bit(DF_mant_len-32+2))