Mercurial > hg > xemacs-beta
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)); |