value sml_abs_int(value x) { value tmp, v; tmp = VAL_TO_LONG(x); if( tmp < 0 ) tmp = -tmp; v = LONG_TO_VAL(tmp); if( VAL_TO_LONG(v) != tmp ) raise_overflow(); return v; }
value sml_trunc(value f) { double r; long i; value v; r = Double_val(f); if ((r >= (double) (MAX_TAGGED_LONG+1)) || (r <= (double)(MIN_TAGGED_LONG-1))) goto raise_trunc; i = (long) r; v = LONG_TO_VAL(i); return v; raise_trunc: raise_overflow(); return Val_unit; /* Can't reach return */ }
value sml_round(value f) { double r; long i; value v; r = rint(Double_val(f)); if ((r > (double) (MAX_TAGGED_LONG)) || (r < (double)(MIN_TAGGED_LONG))) goto raise_round; i = (long) r; v = LONG_TO_VAL(i); return v; raise_round: raise_overflow(); return Val_unit; /* Can't reach return */ }
value sml_ceil(value f) { double r; long i; value v; r = Double_val(f); if( r >= 0.0 ) { if( r > ((double) (MAX_TAGGED_LONG)) ) goto raise_ceil; i = (long) r; if( r > ((double) i) ) i += 1; } else { if( r <= ((double) (MIN_TAGGED_LONG-1)) ) goto raise_ceil; i = (long) r; } v = LONG_TO_VAL(i); if( VAL_TO_LONG(v) != i ) goto raise_ceil; return v; raise_ceil: raise_overflow(); return Val_unit; /* Can't reach return */ }
value sml_floor(value f) { double r; long i; value v; r = Double_val(f); if( r >= 0.0 ) { if( r >= ((double) MAX_TAGGED_LONG + 1) ) goto raise_floor; i = (long) r; } else { if( r < ((double) MIN_TAGGED_LONG) ) goto raise_floor; i = (long) r; if( r < ((double) i) ) i -= 1; } v = LONG_TO_VAL(i); if( VAL_TO_LONG(v) != i ) goto raise_floor; return v; raise_floor: raise_overflow(); return Val_unit; /* Can't reach return */ }
inline void raise_div_overflow() { raise_overflow("division"); }