%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % fp_op provides a template for defining a floating point operation % for the case when both arguments are finites.
fin,fin1,fin2: var (finite?)
op: var fp_ops
mode: var rounding_mode
apply(op,fin1,(fin2:{fin| div?(op) => not zero?(fin)})): real = cases op of
add: value(fin1) + value(fin2),
sub: value(fin1) - value(fin2),
mult: value(fin1) * value(fin2),
div: value(fin1) / value(fin2) endcases
signed_zero(op, fin1, fin2, mode): {fin | zero?(fin)} = CASES op OF
add: IF zero?(fin1)
& zero?(fin2) & sign(fin1) = sign(fin2) THEN fin1 ELSIF to_neg?(mode) THEN neg_zero ELSE pos_zero ENDIF,
sub: IF zero?(fin1)
& zero?(fin2) & sign(fin1) /= sign(fin2) THEN fin1 ELSIF to_neg?(mode) THEN neg_zero ELSE pos_zero ENDIF,
mult: IF sign(fin1) = sign(fin2) THEN pos_zero ELSE neg_zero ENDIF,
div: IF sign(fin1) = sign(fin2) THEN pos_zero ELSE neg_zero ENDIF ENDCASES
fp_op(op, fin1, (fin2: {fin | div?(op) => NOT zero?(fin)}), mode): fp_num = LET r = fp_round(apply(op, fin1, fin2), mode) INIF r = 0 THEN signed_zero(op, fin1, fin2, mode) ELSE real_to_fp(r) ENDIF
fp_op_x(op,fin1,(fin2:{fin| div?(op) => not zero?(fin)}),mode):
[fp_num, exception]
= LET rp = fp_round_x(apply(op, fin1, fin2), mode) INIF proj_1(rp) = 0 THEN (signed_zero(op, fin1, fin2, mode),proj_2(rp)) ELSE real_to_fp_x(rp) ENDIF
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.