%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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
%% bug test spec, won't typecheck, %% cannot determine full theory instance % fp_id(fp):fp_num = % cases fp of % finite(s,e,d): fp, % infinite(s): fp, % NaN(sig,data):fp % endcases
END IEEE_854_defs
¤ 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.0.14Bemerkung:
(vorverarbeitet)
¤
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.