comparison src/number.c @ 4883:f730384b8ddf

Be more careful about canonical integer forms when dealing with ratios. 2010-01-24 Aidan Kehoe <kehoea@parhasard.net> * number.c (Fnumerator, Fdenominator, Fcanonicalize_number): Be more careful to return integers in their canonical forms here, and to give the same answer all the time when treating a rational that is itself is an integer as a ratio.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 24 Jan 2010 19:56:31 +0000
parents 2fc0e2f18322
children 1e9078742fa7 19a72041c5ed
comparison
equal deleted inserted replaced
4869:e533a9912ef1 4883:f730384b8ddf
246 */ 246 */
247 (rational)) 247 (rational))
248 { 248 {
249 CONCHECK_RATIONAL (rational); 249 CONCHECK_RATIONAL (rational);
250 #ifdef HAVE_RATIO 250 #ifdef HAVE_RATIO
251 return RATIOP (rational) 251 if (RATIOP (rational))
252 ? make_bignum_bg (XRATIO_NUMERATOR (rational)) 252 {
253 : rational; 253 return
254 #else 254 Fcanonicalize_number (make_bignum_bg (XRATIO_NUMERATOR (rational)));
255 }
256 #endif
255 return rational; 257 return rational;
256 #endif
257 } 258 }
258 259
259 DEFUN ("denominator", Fdenominator, 1, 1, 0, /* 260 DEFUN ("denominator", Fdenominator, 1, 1, 0, /*
260 Return the denominator of the canonical form of RATIONAL. 261 Return the denominator of the canonical form of RATIONAL.
261 If RATIONAL is an integer, 1 is returned. 262 If RATIONAL is an integer, 1 is returned.
262 */ 263 */
263 (rational)) 264 (rational))
264 { 265 {
265 CONCHECK_RATIONAL (rational); 266 CONCHECK_RATIONAL (rational);
266 #ifdef HAVE_RATIO 267 #ifdef HAVE_RATIO
267 return RATIOP (rational) 268 if (RATIOP (rational))
268 ? make_bignum_bg (XRATIO_DENOMINATOR (rational)) 269 {
269 : make_int (1); 270 return Fcanonicalize_number (make_bignum_bg
270 #else 271 (XRATIO_DENOMINATOR (rational)));
271 return rational; 272 }
272 #endif 273 #endif
274 return make_int (1);
273 } 275 }
274 276
275 277
276 /******************************** Bigfloats *********************************/ 278 /******************************** Bigfloats *********************************/
277 #ifdef HAVE_BIGFLOAT 279 #ifdef HAVE_BIGFLOAT
449 appropriate. */ 451 appropriate. */
450 #ifdef HAVE_RATIO 452 #ifdef HAVE_RATIO
451 if (RATIOP (number) && 453 if (RATIOP (number) &&
452 bignum_fits_long_p (XRATIO_DENOMINATOR (number)) && 454 bignum_fits_long_p (XRATIO_DENOMINATOR (number)) &&
453 bignum_to_long (XRATIO_DENOMINATOR (number)) == 1L) 455 bignum_to_long (XRATIO_DENOMINATOR (number)) == 1L)
454 number = make_bignum_bg (XRATIO_NUMERATOR (number)); 456 number = Fcanonicalize_number (make_bignum_bg (XRATIO_NUMERATOR (number)));
455 #endif 457 #endif
456 #ifdef HAVE_BIGNUM 458 #ifdef HAVE_BIGNUM
457 if (BIGNUMP (number) && bignum_fits_emacs_int_p (XBIGNUM_DATA (number))) 459 if (BIGNUMP (number) && bignum_fits_emacs_int_p (XBIGNUM_DATA (number)))
458 { 460 {
459 EMACS_INT n = bignum_to_emacs_int (XBIGNUM_DATA (number)); 461 EMACS_INT n = bignum_to_emacs_int (XBIGNUM_DATA (number));