Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
This file is part of the Flocq formalization of floating-point
arithmetic in Coq: http://flocq.gforge.inria.fr/
Copyright (C) 2010-2018 Sylvie Boldo
Copyright (C) 2010-2018 Guillaume Melquiond
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
COPYING file for more details.
Copyright (C) 2010-2018 Guillaume Melquiond
Require Import Raux Defs Generic_fmt Float_prop Digits Bracket. Set Implicit Arguments. Set Strongly Strict Implicit. Section Fcalc_div. Variable beta : radix. Notation bpow e := (bpow beta e). Variable fexp : Z -> Z.
Computes a mantissa of precision p, the corresponding exponent,
and the position with respect to the real quotient of the
input floating-point numbers.
The algorithm performs the following steps:
Complexity is fine as long as p1 <= 2p and p2 <= p.
- Shift dividend mantissa so that it has at least p2 + p digits.
- Perform the Euclidean division.
- Compute the position according to the division remainder.
beta:radixfexp:Z -> Zforall m1 e1 m2 e2 : Z, (0 < m1)%Z -> (0 < m2)%Z -> let e := (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zbeta:radixfexp:Z -> Zforall m1 e1 m2 e2 : Z, (0 < m1)%Z -> (0 < m2)%Z -> let e := (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet e := (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet e := (mag beta (F2R {| Fnum := m1; Fexp := e1 |}) - (Zdigits beta m2 + e2))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet e := (mag beta (F2R {| Fnum := m1; Fexp := e1 |}) - mag beta (F2R {| Fnum := m2; Fexp := e2 |}))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%ZF2R {| Fnum := m1; Fexp := e1 |} <> 0%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%ZF2R {| Fnum := m2; Fexp := e2 |} <> 0%Rnow apply F2R_neq_0, Zgt_not_eq. Qed. Definition Fdiv_core m1 e1 m2 e2 e := let (m1', m2') := if Zle_bool e (e1 - e2)%Z then (m1 * Zpower beta (e1 - e2 - e), m2)%Z else (m1, m2 * Zpower beta (e - (e1 - e2)))%Z in let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r loc_Exact).beta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%ZF2R {| Fnum := m2; Fexp := e2 |} <> 0%Rbeta:radixfexp:Z -> Zforall m1 e1 m2 e2 e : Z, (0 < m1)%Z -> (0 < m2)%Z -> let '(m, l) := Fdiv_core m1 e1 m2 e2 e in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zforall m1 e1 m2 e2 e : Z, (0 < m1)%Z -> (0 < m2)%Z -> let '(m, l) := Fdiv_core m1 e1 m2 e2 e in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet '(m, l) := Fdiv_core m1 e1 m2 e2 e in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet '(m, l) := let (m1', m2') := if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z) in let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typelet '(m, l) := let (m1', m2') := m12 in let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')let '(m, l) := let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%R /\ (0 < m2')%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')Hf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zlet '(m, l) := let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%R /\ (0 < m2')%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')(IZR m1 * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR m2' * bpow e)%R /\ (0 < m2')%Zbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <=? e1 - e2)%Z = true(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR (m1 * beta ^ (e1 - e2 - e)) / IZR m2' * bpow e)%R /\ (0 < m2')%Zbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e <=? e1 - e2)%Z = false(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR (m2 * beta ^ (e - (e1 - e2))) * bpow e)%R /\ (0 < m2 * beta ^ (e - (e1 - e2)))%Zbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <=? e1 - e2)%Z = true(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR (m1 * beta ^ (e1 - e2 - e)) / IZR m2' * bpow e)%R /\ (0 < m2')%Zbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <=? e1 - e2)%Z = true(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR (m1 * beta ^ (e1 - e2 - e)) / IZR m2' * bpow e)%Rbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <= e1 - e2)%Z(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR (m1 * beta ^ (e1 - e2 - e)) / IZR m2' * bpow e)%Rbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <= e1 - e2)%Z(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR m1 * bpow (e1 - e2 - e) / IZR m2' * bpow e)%Rbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <= e1 - e2)%Z(IZR m1 * bpow e1 / (IZR m2' * bpow e2))%R = (IZR m1 * (bpow e1 * / bpow e2 * / bpow e) / IZR m2' * bpow e)%Rbeta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <= e1 - e2)%Zbpow e <> 0%R /\ bpow e2 <> 0%R /\ IZR m2' <> 0%Rnow apply IZR_neq, Zgt_not_eq.beta:radixfexp:Z -> Zm1, e1, e2, e:ZHm1:(0 < m1)%Zm2':Zm12:=((m1 * beta ^ (e1 - e2 - e))%Z, m2'):(Z * Z)%typeHm:m12 = ((m1 * beta ^ (e1 - e2 - e))%Z, m2')Hm2:(0 < m2')%ZHe':(e <= e1 - e2)%ZIZR m2' <> 0%Rbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e <=? e1 - e2)%Z = false(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR (m2 * beta ^ (e - (e1 - e2))) * bpow e)%R /\ (0 < m2 * beta ^ (e - (e1 - e2)))%Zbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR (m2 * beta ^ (e - (e1 - e2))) * bpow e)%R /\ (0 < m2 * beta ^ (e - (e1 - e2)))%Zbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(0 < m2 * beta ^ (e - (e1 - e2)))%Zbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR (m2 * beta ^ (e - (e1 - e2))) * bpow e)%Rbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(0 < m2 * beta ^ (e - (e1 - e2)))%Zapply Zpower_gt_0 ; omega.beta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(0 < beta ^ (e - (e1 - e2)))%Zbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / IZR (m2 * beta ^ (e - (e1 - e2))) * bpow e)%Rbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / (IZR m2 * bpow (e - (e1 - e2))) * bpow e)%Rbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Z(IZR m1' * bpow e1 / (IZR m2 * bpow e2))%R = (IZR m1' / (IZR m2 * (bpow e * / (bpow e1 * / bpow e2))) * bpow e)%Rbeta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%Zbpow e2 <> 0%R /\ bpow e1 <> 0%R /\ bpow e <> 0%R /\ IZR m2 <> 0%Rnow apply IZR_neq, Zgt_not_eq.beta:radixfexp:Z -> Ze1, m2, e2, e, m1':Zm12:=(m1', (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typeHm:m12 = (m1', (m2 * beta ^ (e - (e1 - e2)))%Z)Hm1:(0 < m1')%ZHm2:(0 < m2)%ZHe':(e1 - e2 < e)%ZIZR m2 <> 0%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zm12:=if (e <=? e1 - e2)%Z then ((m1 * beta ^ (e1 - e2 - e))%Z, m2) else (m1, (m2 * beta ^ (e - (e1 - e2)))%Z):(Z * Z)%typem1', m2':ZHm:m12 = (m1', m2')Hf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zlet '(m, l) := let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zlet '(m, l) := let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Z(let (q, r) := Z.div_eucl m1' m2' in m1' = (m2' * q + r)%Z /\ (0 <= r < m2')%Z) -> let '(m, l) := let '(q, r) := Z.div_eucl m1' m2' in (q, new_location m2' r SpecFloatCopy.loc_Exact) in inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:Zm1' = (m2' * q + r)%Z /\ (0 <= r < m2')%Z -> inbetween_float beta q e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween_float beta q e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween_float beta q e (IZR m1' / IZR m2' * bpow e) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween (IZR (Fnum {| Fnum := q; Fexp := e |}) * bpow (Fexp {| Fnum := q; Fexp := e |})) (IZR (Fnum {| Fnum := q + 1; Fexp := e |}) * bpow (Fexp {| Fnum := q + 1; Fexp := e |})) (IZR m1' / IZR m2' * bpow e) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween (IZR q * bpow e) (IZR (q + 1) * bpow e) (IZR m1' / IZR m2' * bpow e) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween (IZR q * bpow e) ((IZR q + 1) * bpow e) ((IZR m2' * IZR q + IZR r) / IZR m2' * bpow e) (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Z(0 < bpow e)%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(m2' <= 1)%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q) (IZR q + IZR m2' * / IZR m2') ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(0 < / IZR m2')%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q + IZR r * / IZR m2') (IZR q + IZR (r + 1) * / IZR m2') ((IZR m2' * IZR q + IZR r) / IZR m2') SpecFloatCopy.loc_Exactbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(0 < IZR m2')%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q + IZR r * / IZR m2') (IZR q + IZR (r + 1) * / IZR m2') ((IZR m2' * IZR q + IZR r) / IZR m2') SpecFloatCopy.loc_Exactbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Zinbetween (IZR q + IZR r * / IZR m2') (IZR q + IZR (r + 1) * / IZR m2') ((IZR m2' * IZR q + IZR r) / IZR m2') SpecFloatCopy.loc_Exactbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z((IZR m2' * IZR q + IZR r) / IZR m2')%R = (IZR q + IZR r * / IZR m2')%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%ZIZR m2' <> 0%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%Z(IZR m2' * / IZR m2')%R = 1%Rnow apply IZR_neq, Zgt_not_eq.beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(1 < m2')%ZIZR m2' <> 0%Rbeta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1', m2':ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / IZR m2' * bpow e)%RHm2':(0 < m2')%Zq, r:ZHq:m1' = (m2' * q + r)%ZHr:(0 <= r < m2')%ZHm2'':(m2' <= 1)%Zinbetween (IZR q) (IZR q + 1) ((IZR m2' * IZR q + IZR r) / IZR m2') (new_location m2' r SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1':ZHm2':(0 < 1)%ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / 1 * bpow e)%Rq:ZHm2'':(1 <= 1)%ZHq:m1' = (1 * q + 0)%ZHr:(0 <= 0 < 1)%Zinbetween (IZR q) (IZR q + 1) ((1 * IZR q + 0) / 1) (new_location 1 0 SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1':ZHm2':(0 < 1)%ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / 1 * bpow e)%Rq:ZHm2'':(1 <= 1)%ZHq:m1' = (1 * q + 0)%ZHr:(0 <= 0 < 1)%Zinbetween (IZR q) (IZR q + 1) ((1 * IZR q + 0) * / 1) (new_location 1 0 SpecFloatCopy.loc_Exact)now constructor. Qed. Definition Fdiv (x y : float beta) := let (m1, e1) := x in let (m2, e2) := y in let e' := ((Zdigits beta m1 + e1) - (Zdigits beta m2 + e2))%Z in let e := Z.min (Z.min (fexp e') (fexp (e' + 1))) (e1 - e2) in let '(m, l) := Fdiv_core m1 e1 m2 e2 e in (m, e, l).beta:radixfexp:Z -> Zm1, e1, m2, e2, e:Zm12:(Z * Z)%typem1':ZHm2':(0 < 1)%ZHf:(F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})%R = (IZR m1' / 1 * bpow e)%Rq:ZHm2'':(1 <= 1)%ZHq:m1' = (1 * q + 0)%ZHr:(0 <= 0 < 1)%Zinbetween (IZR q) (IZR q + 1) (IZR q) (new_location 1 0 SpecFloatCopy.loc_Exact)beta:radixfexp:Z -> Zforall x y : float beta, (0 < F2R x)%R -> (0 < F2R y)%R -> let '(m, e, l) := Fdiv x y in (e <= cexp beta fexp (F2R x / F2R y))%Z /\ inbetween_float beta m e (F2R x / F2R y) lbeta:radixfexp:Z -> Zforall x y : float beta, (0 < F2R x)%R -> (0 < F2R y)%R -> let '(m, e, l) := Fdiv x y in (e <= cexp beta fexp (F2R x / F2R y))%Z /\ inbetween_float beta m e (F2R x / F2R y) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < F2R {| Fnum := m1; Fexp := e1 |})%RHm2:(0 < F2R {| Fnum := m2; Fexp := e2 |})%Rlet '(m, e, l) := Fdiv {| Fnum := m1; Fexp := e1 |} {| Fnum := m2; Fexp := e2 |} in (e <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < F2R {| Fnum := m2; Fexp := e2 |})%Rlet '(m, e, l) := Fdiv {| Fnum := m1; Fexp := e1 |} {| Fnum := m2; Fexp := e2 |} in (e <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet '(m, e, l) := Fdiv {| Fnum := m1; Fexp := e1 |} {| Fnum := m2; Fexp := e2 |} in (e <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Zlet '(m, e, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 (Z.min (Z.min (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))) (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2) + 1))) (e1 - e2)) in (m, Z.min (Z.min (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))) (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2) + 1))) (e1 - e2), l) in (e <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Z(let e := (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z in (e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Z) -> let '(m, e, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 (Z.min (Z.min (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))) (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2) + 1))) (e1 - e2)) in (m, Z.min (Z.min (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))) (fexp (Zdigits beta m1 + e1 - (Zdigits beta m2 + e2) + 1))) (e1 - e2), l) in (e <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Z(let e0 := e in (e0 <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e0 + 1)%Z) -> let '(m, e0, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 (Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2)) in (m, Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2), l) in (e0 <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e0 (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):Z(let e0 := e in (e0 <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e0 + 1)%Z) -> let '(m, e0, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 e' in (m, e', l) in (e0 <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e0 (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zlet '(m, e0, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 e' in (m, e', l) in (e0 <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e0 (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Z(let '(m, l) := Fdiv_core m1 e1 m2 e2 e' in inbetween_float beta m e' (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) l) -> let '(m, e0, l) := let '(m, l) := Fdiv_core m1 e1 m2 e2 e' in (m, e', l) in (e0 <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m e0 (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationinbetween_float beta m' e' (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) l -> (e' <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z /\ inbetween_float beta m' e' (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) lbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.location(e' <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.location(Z.min (fexp e) (fexp (e + 1)) <= cexp beta fexp (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.location(Z.min (fexp e) (fexp (e + 1)) <= fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:(e < mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z(Z.min (fexp e) (fexp (e + 1)) <= fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:e = mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})(Z.min (fexp e) (fexp (e + 1)) <= fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:(e < mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z(Z.min (fexp e) (fexp (e + 1)) <= fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:(e < mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Z(Z.min (fexp e) (fexp (e + 1)) <= fexp (e + 1))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:(e < mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Zfexp (e + 1) = fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))clear -H1 H2 H ; apply f_equal ; omega.beta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:(e < mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%Zfexp (e + 1) = fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))beta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:e = mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})(Z.min (fexp e) (fexp (e + 1)) <= fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})))%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:e = mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})(Z.min (fexp e) (fexp (e + 1)) <= fexp e)%Zbeta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:e = mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})fexp e = fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))clear -H1 H2 H ; apply f_equal ; omega. Qed. End Fcalc_div.beta:radixfexp:Z -> Zm1, e1, m2, e2:ZHm1:(0 < m1)%ZHm2:(0 < m2)%Ze:=(Zdigits beta m1 + e1 - (Zdigits beta m2 + e2))%Z:Ze':=Z.min (Z.min (fexp e) (fexp (e + 1))) (e1 - e2):ZH1:(e <= mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))%ZH2:(mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}) <= e + 1)%Zm':Zl:SpecFloatCopy.locationH:e = mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |})fexp e = fexp (mag beta (F2R {| Fnum := m1; Fexp := e1 |} / F2R {| Fnum := m2; Fexp := e2 |}))