X-Git-Url: https://ginac.de/CLN/cln.git//cln.git?a=blobdiff_plain;f=src%2Ffloat%2Fdfloat%2Felem%2Fcl_DF_from_RA.cc;h=6e9cbf7573e9415eb84667d79e3031197de07a1b;hb=5370ad8054201cf23d4f94a52f4d3f7f9f3cd511;hp=43f302211badd8fb80ba1c0217123655c951756d;hpb=850abfde7f0d985ba01526c346bcd0d733562943;p=cln.git diff --git a/src/float/dfloat/elem/cl_DF_from_RA.cc b/src/float/dfloat/elem/cl_DF_from_RA.cc index 43f3022..6e9cbf7 100644 --- a/src/float/dfloat/elem/cl_DF_from_RA.cc +++ b/src/float/dfloat/elem/cl_DF_from_RA.cc @@ -41,13 +41,13 @@ const cl_DF cl_RA_to_DF (const cl_RA& x) 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; } } @@ -66,10 +66,15 @@ const cl_DF cl_RA_to_DF (const cl_RA& x) 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); @@ -106,7 +111,9 @@ const cl_DF cl_RA_to_DF (const cl_RA& x) 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))