%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % basic instruction schemata, ignoring exceptions for now % These functions are listed in section 5.1 of IEEE-854
fp,fp1,fp2: var fp_num
mode: var rounding_mode
% Addition operator
fp_add(fp1, fp2, mode): fp_num = IF finite?(fp1) & finite?(fp2) THEN fp_op(add, fp1, fp2, mode) ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan(add, fp1, fp2) ELSE fp_add_inf(fp1, fp2) ENDIF
% Addition operator with exceptions
fp_add_x(fp1, fp2, mode): [fp_num, exception] = IF finite?(fp1) & finite?(fp2) THEN fp_op_x(add, fp1, fp2, mode) ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan_x(add, fp1, fp2) ELSE fp_add_inf_x(fp1, fp2) ENDIF
% Subtraction Operator
fp_sub(fp1, fp2, mode): fp_num = IF finite?(fp1) & finite?(fp2) THEN fp_op(sub, fp1, fp2, mode) ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan(sub, fp1, fp2) ELSE fp_sub_inf(fp1, fp2) ENDIF
% Subtraction Operator with exceptions
fp_sub_x(fp1, fp2, mode): [fp_num, exception] = IF finite?(fp1) & finite?(fp2) THEN fp_op_x(sub, fp1, fp2, mode) ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan_x(sub, fp1, fp2) ELSE fp_sub_inf_x(fp1, fp2) ENDIF
% Excluding NaN operands, we should be able to prove a - b = a + (-b) % independent of the rounding mode
fsub_alt_def: LEMMA NOT (NaN?(fp1) OR NaN?(fp2))
=> fp_sub(fp1, fp2, mode) = fp_add(fp1, toggle_sign(fp2), mode)
% Multiplication
fp_mul(fp1, fp2, mode): fp_num = IF finite?(fp1) & finite?(fp2) THEN fp_op(mult, fp1, fp2, mode) ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan(mult, fp1, fp2) ELSE fp_mul_inf(fp1, fp2) ENDIF
% Division
fp_div(fp1, fp2, mode): fp_num = IF finite?(fp1) & finite?(fp2) THENIF zero?(fp2) THENIF zero?(fp1) THEN invalid ELSE infinite(mult_sign(fp1, fp2)) ENDIF ELSE fp_op(div, fp1, fp2, mode) ENDIF ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan(div, fp1, fp2) ELSE fp_div_inf(fp1, fp2) ENDIF
% Remainder (independent of rounding mode)
fp_rem(fp1, fp2): fp_num = IF finite?(fp1) & finite?(fp2) THENIF zero?(fp2) THEN invalid ELSE REM(fp1, fp2) ENDIF ELSIF NaN?(fp1) OR NaN?(fp2) THEN fp_nan(div, fp1, fp2) ELSIF infinite?(fp1) THEN invalid ELSE fp1 ENDIF
% Square root
fp_sqrt(fp, mode): fp_num = IF NaN?(fp) THEN NaN_sqrt(fp) ELSIF zero?(fp) THEN fp ELSIF finite?(fp) THENIF sign(fp) = pos THEN real_to_fp(fp_round(sqrt(value(fp)), mode)) ELSE invalid ENDIF ELSIF i_sign(fp) = pos THEN fp ELSE invalid 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.