factor/native/ratio.c

59 lines
1.0 KiB
C
Raw Normal View History

2004-08-04 22:43:58 -04:00
#include "factor.h"
2004-09-18 22:29:29 -04:00
/* Does not reduce to lowest terms, so should only be used by math
library implementation, to avoid breaking invariants. */
void primitive_from_fraction(void)
{
CELL numerator, denominator;
maybe_garbage_collection();
denominator = dpop();
numerator = dpop();
2004-09-18 22:29:29 -04:00
if(zerop(denominator))
raise(SIGFPE);
if(onep(denominator))
dpush(numerator);
2004-09-19 00:33:40 -04:00
else
2004-09-19 00:57:33 -04:00
{
F_RATIO* ratio = allot(sizeof(F_RATIO));
2004-09-19 00:57:33 -04:00
ratio->numerator = numerator;
ratio->denominator = denominator;
dpush(tag_ratio(ratio));
}
}
2004-08-04 22:43:58 -04:00
void primitive_numerator(void)
{
switch(type_of(dpeek()))
2004-08-04 22:43:58 -04:00
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
/* No op */
break;
case RATIO_TYPE:
drepl(untag_ratio(dpeek())->numerator);
2004-08-04 22:43:58 -04:00
break;
default:
type_error(RATIONAL_TYPE,dpeek());
2004-08-04 22:43:58 -04:00
break;
}
}
void primitive_denominator(void)
{
switch(type_of(dpeek()))
2004-08-04 22:43:58 -04:00
{
case FIXNUM_TYPE:
case BIGNUM_TYPE:
drepl(tag_fixnum(1));
2004-08-04 22:43:58 -04:00
break;
case RATIO_TYPE:
drepl(untag_ratio(dpeek())->denominator);
2004-08-04 22:43:58 -04:00
break;
default:
type_error(RATIONAL_TYPE,dpeek());
2004-08-04 22:43:58 -04:00
break;
}
}