@@ -2251,6 +2251,7 @@ mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
22512251{
22522252 mpd_ssize_t size ;
22532253
2254+ assert (!mpd_isspecial (a ));
22542255 assert (n >= 0 );
22552256
22562257 if (mpd_iszerocoeff (a ) || n == 0 ) {
@@ -2265,9 +2266,9 @@ mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
22652266 _mpd_baseshiftl (result -> data , a -> data , size , a -> len , n );
22662267
22672268 mpd_copy_flags (result , a );
2268- result -> len = size ;
22692269 result -> exp = a -> exp ;
22702270 result -> digits = a -> digits + n ;
2271+ result -> len = size ;
22712272
22722273 return 1 ;
22732274}
@@ -2295,16 +2296,17 @@ _mpd_get_rnd(const mpd_uint_t *data, mpd_ssize_t len, int use_msd)
22952296}
22962297
22972298/*
2298- * Same as mpd_qshiftr(), but 'result' is a static array. It is the
2299- * caller's responsibility to make sure that the array is big enough.
2300- * The function cannot fail.
2299+ * Same as mpd_qshiftr(), but 'result' is an mpd_t with a static coefficient.
2300+ * It is the caller's responsibility to ensure that the coefficient is big
2301+ * enough. The function cannot fail.
23012302 */
23022303mpd_uint_t
23032304mpd_qsshiftr (mpd_t * result , const mpd_t * a , mpd_ssize_t n )
23042305{
23052306 mpd_uint_t rnd ;
23062307 mpd_ssize_t size ;
23072308
2309+ assert (!mpd_isspecial (a ));
23082310 assert (n >= 0 );
23092311
23102312 if (mpd_iszerocoeff (a ) || n == 0 ) {
@@ -2315,18 +2317,16 @@ mpd_qsshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n)
23152317 if (n >= a -> digits ) {
23162318 rnd = _mpd_get_rnd (a -> data , a -> len , (n == a -> digits ));
23172319 mpd_zerocoeff (result );
2318- result -> digits = 1 ;
2319- size = 1 ;
23202320 }
23212321 else {
23222322 result -> digits = a -> digits - n ;
23232323 size = mpd_digits_to_size (result -> digits );
23242324 rnd = _mpd_baseshiftr (result -> data , a -> data , a -> len , n );
2325+ result -> len = size ;
23252326 }
23262327
23272328 mpd_copy_flags (result , a );
23282329 result -> exp = a -> exp ;
2329- result -> len = size ;
23302330
23312331 return rnd ;
23322332}
@@ -2343,6 +2343,7 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n)
23432343 mpd_uint_t rnd ;
23442344 mpd_ssize_t size ;
23452345
2346+ assert (!mpd_isspecial (result ));
23462347 assert (n >= 0 );
23472348
23482349 if (mpd_iszerocoeff (result ) || n == 0 ) {
@@ -2352,19 +2353,16 @@ mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n)
23522353 if (n >= result -> digits ) {
23532354 rnd = _mpd_get_rnd (result -> data , result -> len , (n == result -> digits ));
23542355 mpd_zerocoeff (result );
2355- result -> digits = 1 ;
2356- size = 1 ;
23572356 }
23582357 else {
23592358 rnd = _mpd_baseshiftr (result -> data , result -> data , result -> len , n );
23602359 result -> digits -= n ;
23612360 size = mpd_digits_to_size (result -> digits );
23622361 /* reducing the size cannot fail */
23632362 mpd_qresize (result , size , & dummy );
2363+ result -> len = size ;
23642364 }
23652365
2366- result -> len = size ;
2367-
23682366 return rnd ;
23692367}
23702368
@@ -2381,6 +2379,7 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
23812379 mpd_uint_t rnd ;
23822380 mpd_ssize_t size ;
23832381
2382+ assert (!mpd_isspecial (a ));
23842383 assert (n >= 0 );
23852384
23862385 if (mpd_iszerocoeff (a ) || n == 0 ) {
@@ -2393,8 +2392,6 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
23932392 if (n >= a -> digits ) {
23942393 rnd = _mpd_get_rnd (a -> data , a -> len , (n == a -> digits ));
23952394 mpd_zerocoeff (result );
2396- result -> digits = 1 ;
2397- size = 1 ;
23982395 }
23992396 else {
24002397 result -> digits = a -> digits - n ;
@@ -2410,11 +2407,11 @@ mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status)
24102407 }
24112408 rnd = _mpd_baseshiftr (result -> data , a -> data , a -> len , n );
24122409 }
2410+ result -> len = size ;
24132411 }
24142412
24152413 mpd_copy_flags (result , a );
24162414 result -> exp = a -> exp ;
2417- result -> len = size ;
24182415
24192416 return rnd ;
24202417}
@@ -3485,6 +3482,7 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
34853482 newsize = _mpd_real_size (q -> data , newsize );
34863483 /* resize to smaller cannot fail */
34873484 mpd_qresize (q , newsize , status );
3485+ mpd_set_flags (q , sign_a ^sign_b );
34883486 q -> len = newsize ;
34893487 mpd_setdigits (q );
34903488
@@ -3502,7 +3500,6 @@ _mpd_qdiv(int action, mpd_t *q, const mpd_t *a, const mpd_t *b,
35023500 exp += shift ;
35033501 }
35043502
3505- mpd_set_flags (q , sign_a ^sign_b );
35063503 q -> exp = exp ;
35073504
35083505
0 commit comments