src/HOL/Library/Float.thy
changeset 63599 f560147710fb
parent 63596 24d329f666c5
child 63663 28d1deca302e
equal deleted inserted replaced
63598:025d6e52d86f 63599:f560147710fb
  1423 proof -
  1423 proof -
  1424   have "0 < x \<Longrightarrow> log 2 x + 1 = log 2 (2 * x)"
  1424   have "0 < x \<Longrightarrow> log 2 x + 1 = log 2 (2 * x)"
  1425     by (simp add: log_mult)
  1425     by (simp add: log_mult)
  1426   then have "bitlen (int x) < bitlen (int y)"
  1426   then have "bitlen (int x) < bitlen (int y)"
  1427     using assms
  1427     using assms
  1428     by (simp add: bitlen_alt_def del: floor_add_one)
  1428     by (simp add: bitlen_alt_def)
  1429       (auto intro!: floor_mono simp add: floor_add_one[symmetric] simp del: floor_add floor_add_one)
  1429       (auto intro!: floor_mono simp add: one_add_floor)
  1430   then show ?thesis
  1430   then show ?thesis
  1431     using assms
  1431     using assms
  1432     by (auto intro!: pos_add_strict simp add: field_simps rat_precision_def)
  1432     by (auto intro!: pos_add_strict simp add: field_simps rat_precision_def)
  1433 qed
  1433 qed
  1434 
  1434 
  1810       by (intro floor_eq) (auto simp: abs_mult sgn_if)
  1810       by (intro floor_eq) (auto simp: abs_mult sgn_if)
  1811     also
  1811     also
  1812     have "\<dots> = \<lfloor>log 2 (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k)\<rfloor>"
  1812     have "\<dots> = \<lfloor>log 2 (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k)\<rfloor>"
  1813       by (subst floor_eq) (auto simp: sgn_if)
  1813       by (subst floor_eq) (auto simp: sgn_if)
  1814     also have "k + \<dots> = \<lfloor>log 2 (2 powr k * (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k))\<rfloor>"
  1814     also have "k + \<dots> = \<lfloor>log 2 (2 powr k * (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k))\<rfloor>"
  1815       unfolding floor_add2[symmetric]
  1815       unfolding int_add_floor
  1816       using pos[OF less'] \<open>\<bar>b\<bar> \<le> _\<close>
  1816       using pos[OF less'] \<open>\<bar>b\<bar> \<le> _\<close>
  1817       by (simp add: field_simps add_log_eq_powr)
  1817       by (simp add: field_simps add_log_eq_powr del: floor_add2)
  1818     also have "2 powr k * (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k) =
  1818     also have "2 powr k * (1 + (r + sgn (sgn ai * b) / 2) / 2 powr k) =
  1819         2 powr k + r + sgn (sgn ai * b) / 2"
  1819         2 powr k + r + sgn (sgn ai * b) / 2"
  1820       by (simp add: sgn_if field_simps)
  1820       by (simp add: sgn_if field_simps)
  1821     finally show ?thesis .
  1821     finally show ?thesis .
  1822   qed
  1822   qed
  1897   also
  1897   also
  1898   have "\<bar>?m1 + ?m2'\<bar> * 2 powr ?e = \<bar>?m1 * 2 + sgn m2\<bar> * 2 powr (?e - 1)"
  1898   have "\<bar>?m1 + ?m2'\<bar> * 2 powr ?e = \<bar>?m1 * 2 + sgn m2\<bar> * 2 powr (?e - 1)"
  1899     by (auto simp: field_simps powr_minus[symmetric] powr_divide2[symmetric] powr_mult_base)
  1899     by (auto simp: field_simps powr_minus[symmetric] powr_divide2[symmetric] powr_mult_base)
  1900   then have "\<lfloor>log 2 \<bar>?m1 + ?m2'\<bar>\<rfloor> + ?e = \<lfloor>log 2 \<bar>real_of_float (Float (?m1 * 2 + sgn m2) (?e - 1))\<bar>\<rfloor>"
  1900   then have "\<lfloor>log 2 \<bar>?m1 + ?m2'\<bar>\<rfloor> + ?e = \<lfloor>log 2 \<bar>real_of_float (Float (?m1 * 2 + sgn m2) (?e - 1))\<bar>\<rfloor>"
  1901     using \<open>?m1 + ?m2' \<noteq> 0\<close>
  1901     using \<open>?m1 + ?m2' \<noteq> 0\<close>
  1902     unfolding floor_add_of_int[symmetric]
  1902     unfolding floor_add_int
  1903     by (simp add: log_add_eq_powr abs_mult_pos)
  1903     by (simp add: log_add_eq_powr abs_mult_pos del: floor_add2)
  1904   finally
  1904   finally
  1905   have "\<lfloor>log 2 \<bar>?sum\<bar>\<rfloor> = \<lfloor>log 2 \<bar>real_of_float (Float (?m1*2 + sgn m2) (?e - 1))\<bar>\<rfloor>" .
  1905   have "\<lfloor>log 2 \<bar>?sum\<bar>\<rfloor> = \<lfloor>log 2 \<bar>real_of_float (Float (?m1*2 + sgn m2) (?e - 1))\<bar>\<rfloor>" .
  1906   then have "plus_down p (Float m1 e1) (Float m2 e2) =
  1906   then have "plus_down p (Float m1 e1) (Float m2 e2) =
  1907       truncate_down p (Float (?m1*2 + sgn m2) (?e - 1))"
  1907       truncate_down p (Float (?m1*2 + sgn m2) (?e - 1))"
  1908     unfolding plus_down_def
  1908     unfolding plus_down_def
  1917         using abs_m2_less_half
  1917         using abs_m2_less_half
  1918         by (simp add: abs_mult powr_add[symmetric] algebra_simps powr_mult_base)
  1918         by (simp add: abs_mult powr_add[symmetric] algebra_simps powr_mult_base)
  1919     next
  1919     next
  1920       have "e1 + \<lfloor>log 2 \<bar>real_of_int m1\<bar>\<rfloor> - 1 = \<lfloor>log 2 \<bar>?a\<bar>\<rfloor> - 1"
  1920       have "e1 + \<lfloor>log 2 \<bar>real_of_int m1\<bar>\<rfloor> - 1 = \<lfloor>log 2 \<bar>?a\<bar>\<rfloor> - 1"
  1921         using \<open>m1 \<noteq> 0\<close>
  1921         using \<open>m1 \<noteq> 0\<close>
  1922         by (simp add: floor_add2[symmetric] algebra_simps log_mult abs_mult del: floor_add2)
  1922         by (simp add: int_add_floor algebra_simps log_mult abs_mult del: floor_add2)
  1923       also have "\<dots> \<le> \<lfloor>log 2 \<bar>?a + ?b\<bar>\<rfloor>"
  1923       also have "\<dots> \<le> \<lfloor>log 2 \<bar>?a + ?b\<bar>\<rfloor>"
  1924         using a_half_less_sum \<open>m1 \<noteq> 0\<close> \<open>?sum \<noteq> 0\<close>
  1924         using a_half_less_sum \<open>m1 \<noteq> 0\<close> \<open>?sum \<noteq> 0\<close>
  1925         unfolding floor_diff_of_int[symmetric]
  1925         unfolding floor_diff_of_int[symmetric]
  1926         by (auto simp add: log_minus_eq_powr powr_minus_divide intro!: floor_mono)
  1926         by (auto simp add: log_minus_eq_powr powr_minus_divide intro!: floor_mono)
  1927       finally
  1927       finally