needs "../formal_lp/arith/float.hl";; needs "../formal_lp/arith/arith_hash_rat.hl";; let rec float_interval_test pp expr x_th = if is_var expr then x_th else let ltm, r_tm = dest_comb expr in if is_comb ltm then let op, l_tm = dest_comb ltm in let l_th = float_interval_test pp l_tm x_th in let r_th = float_interval_test pp r_tm x_th in if op = plus_op_real then float_interval_add pp l_th r_th else if op = mul_op_real then float_interval_mul pp l_th r_th else if op = div_op_real then float_interval_div pp l_th r_th else if op = minus_op_real then float_interval_sub pp l_th r_th else failwith ("Unknown operation: " ^ (fst o dest_const) op) else if ltm = neg_op_real then let r_th = float_interval_test pp r_tm x_th in float_interval_neg r_th else mk_float_interval_num (dest_numeral r_tm);; let rec rat_arith_test expr x_th = if is_var expr then x_th else let ltm, r_tm = dest_comb expr in if is_comb ltm then let op, l_tm = dest_comb ltm in let l_th = rat_arith_test l_tm x_th in let r_th = rat_arith_test r_tm x_th in let th0 = MK_COMB (AP_TERM op l_th, r_th) in let rtm = rand(concl th0) in let th1 = if op = plus_op_real then my_real_rat_add_conv rtm else if op = mul_op_real then my_real_rat_mul_conv rtm else if op = div_op_real then my_real_rat_div_conv rtm else failwith ("Unknown operation: " ^ (fst o dest_const) op) in TRANS th0 th1 else AP_TERM ltm (NUMERAL_TO_NUM_CONV r_tm);; let expr1 = `&1 + x + x*x / &2 + x*x*x / &6 + x*x*x*x / &24 + x*x*x*x*x / &120 + x*x*x*x*x*x / &720`;; let expr2 = `&1 + x*(&1 + x*(&1 / &2 + x*(&1 / &6 + x*(&1 / &24 + x*(&1 / &120 + x / &720)))))`;; let expr3 = `&1 + x*x*(--(&1 / &2) + x*x*(&1 / &24 + x*x*(--(&1 / &720) + x*x*(&1 / &40320 + x*x*(--(&1 / &3628800) + x*x / &479001600)))))`;; let eps_expr = `x*x*x*x*x*x*x*x*x*x*x*x*x*x / &87178291200`;; let f x = 1. +. x*.x*.(~-. 0.5 +. x*.x*.(1. /. 24. +. x*.x*.(~-.1. /. 720. +. x*.x*.(1. /. 40320. +. x*.x*.(~-. 1. /. 3628800. +. x*.x /. 479001600.)))));; f 1.230959417;; let int1 = mk_float_interval_small_num 1 and int3 = mk_float_interval_small_num 3 and int234451 = mk_float_interval_small_num 234451 and int1234567 = mk_float_interval_small_num 1234567;; let pp = 10;; let x1_th = int1;; let x2_th = float_interval_div pp int1 int3;; let x3_th = float_interval_div pp int234451 int1234567;; let x_th = let n = mk_float_interval_num (Num.num_of_string "1230959417") in let d = mk_float_interval_num (Num.num_of_string "1000000000") in float_interval_div pp n d;; (* pp = 11: 10, min_exp = 20: 0.180 100, min_exp = 20: 0.144 *) (* pp = 6: 100, min_exp = 20: 0.116 *) (* pp = 5: 8, min_exp = 20: 0.060 *) float_interval_test pp expr3 x_th;; test 1 (float_interval_test pp expr3) x_th;; float_interval_test pp eps_expr x_th;; let th1 = float_interval_test pp expr3 x_th;; let th2 = float_interval_sub pp th1 x2_th;; float_interval_test pp expr3 x1_th;; float_interval_test pp expr3 x2_th;; float_interval_test pp expr3 x3_th;; let y1_th = REPLACE_NUMERALS_CONV `&1`;; let y2_th = REPLACE_NUMERALS_CONV `&1 / &3`;; let y3_th = REPLACE_NUMERALS_CONV `&234451 / &1234567`;; rat_arith_test expr1 y1_th;; float_interval_test pp expr1 x1_th;; rat_arith_test expr2 y1_th;; float_interval_test pp expr2 x1_th;; rat_arith_test expr1 y2_th;; float_interval_test pp expr1 x2_th;; rat_arith_test expr2 y2_th;; float_interval_test pp expr2 x2_th;; rat_arith_test expr1 y3_th;; float_interval_test pp expr1 x3_th;; rat_arith_test expr2 y3_th;; float_interval_test pp expr2 x3_th;; (* 4: 0.624 *) test 100 (rat_arith_test expr1) y1_th;; (* 4: 2.028 *) test 100 (float_interval_test pp expr1) x1_th;; (* 4: 0.496 *) test 100 (rat_arith_test expr2) y1_th;; (* 4: 1.756 *) test 100 (float_interval_test pp expr2) x1_th;; (* 4: 1.012 *) test 100 (rat_arith_test expr1) y2_th;; (* 4: 4.252 *) test 100 (float_interval_test pp expr1) x2_th;; (* 4: 0.760 *) test 100 (rat_arith_test expr2) y2_th;; (* 4: 2.460 *) test 100 (float_interval_test pp expr2) x2_th;; (* 4: 5.732 *) test 10 (rat_arith_test expr1) y3_th;; (* 4: 0.468 *) test 10 (float_interval_test pp expr1) x3_th;; (* 4: 1.504 *) test 100 (rat_arith_test expr2) y3_th;; (* 4: 0.244 *) test 100 (float_interval_test pp expr2) x3_th;;