equal
deleted
inserted
replaced
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 |