Beispiel #1
0
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;
}
Beispiel #2
0
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 */
}
Beispiel #3
0
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 */
}
Beispiel #4
0
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 */
}
Beispiel #5
0
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 */
}
Beispiel #6
0
inline void raise_div_overflow()
{
   raise_overflow("division");
}