intros P H p q f H0 H1 H2 H3.
case (Rle_or_lt 0 p); intros H4; case (Rle_or_lt 0 q); intros H5.
apply errorBoundedMultPos with P; auto.
replace (Fexp p) with (Fexp (Fopp p)); auto with float.
replace (Fexp q) with (Fexp (Fopp q)); auto with float.
cut ((p * q)%R = (Fopp p * Fopp q)%R); [ intros H6; rewrite H6 | idtac ].
apply errorBoundedMultNeg with P; auto with float real.
unfold FtoRradix in |- *; rewrite Fopp_correct; auto with real.
unfold FtoRradix in |- *; rewrite Fopp_correct; auto with real.
rewrite <- H6; auto.
unfold FtoRradix in |- *; repeat rewrite Fopp_correct; ring.
apply errorBoundedMultNeg with P; auto with float real.
replace (Fexp p) with (Fexp (Fopp p)); auto with float.
replace (Fexp q) with (Fexp (Fopp q)); auto with float.
cut ((p * q)%R = (Fopp p * Fopp q)%R); [ intros H6; rewrite H6 | idtac ].
apply errorBoundedMultPos with P; auto with float real.
unfold FtoRradix in |- *; rewrite Fopp_correct; auto with real.
unfold FtoRradix in |- *; rewrite Fopp_correct; auto with real.
rewrite <- H6; auto.
unfold FtoRradix in |- *; repeat rewrite Fopp_correct; ring.
Qed.

(* Specifications: *)
Theorem errorBoundedMultExp_aux :
forall n1 n2 : Z,
(Zabs n1 < Zpos (vNum b))%Z ->
(Zabs n2 < Zpos (vNum b))%Z ->
(exists ny : Z,
(exists ey : Z,
(n1 * n2)%R = (ny * powerRZ radix ey)%R :>R /\
(Zabs ny < Zpos (vNum b))%Z)) ->
exists nx : Z,
(exists ex : Z,
(n1 * n2)%R = (nx * powerRZ radix ex)%R :>R /\
(Zabs nx < Zpos (vNum b))%Z /\
(0 <= ex)%Z /\ (ex <= precision)%Z).