Struct ComparableFloatRef

Source
pub struct ComparableFloatRef<'a>(pub &'a Float);
Expand description

ComparableFloatRef is a wrapper around a Float, taking the Float be reference.

See the ComparableFloat documentation for details.

Tuple Fields§

§0: &'a Float

Methods from Deref<Target = Float>§

Source

pub fn abs_negative_zero_ref(&self) -> Float

If self is negative zero, returns positive zero; otherwise, returns self, taking self by reference.

This function does not overflow or underflow.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, Zero,
};
use malachite_float::{ComparableFloat, Float};

assert_eq!(
    ComparableFloat(Float::NAN.abs_negative_zero_ref()),
    ComparableFloat(Float::NAN)
);
assert_eq!(Float::INFINITY.abs_negative_zero_ref(), Float::INFINITY);
assert_eq!(
    Float::NEGATIVE_INFINITY.abs_negative_zero_ref(),
    Float::NEGATIVE_INFINITY
);
assert_eq!(
    ComparableFloat(Float::ZERO.abs_negative_zero_ref()),
    ComparableFloat(Float::ZERO)
);
assert_eq!(
    ComparableFloat(Float::NEGATIVE_ZERO.abs_negative_zero_ref()),
    ComparableFloat(Float::ZERO)
);
assert_eq!(Float::ONE.abs_negative_zero_ref(), Float::ONE);
assert_eq!(
    Float::NEGATIVE_ONE.abs_negative_zero_ref(),
    Float::NEGATIVE_ONE
);
Source

pub fn add_prec_round_ref_val( &self, other: Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Adds two Floats, rounding the result to the specified precision and with the specified rounding mode. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\infty,-\infty,p,m)=f(-\infty,\infty,p,m)= \text{NaN}$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,p,m)=0.0$
  • $f(-0.0,-0.0,p,m)=-0.0$
  • $f(0.0,-0.0,p,m)=f(-0.0,0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,-0.0,p,m)=f(-0.0,0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,-x,p,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,-x,p,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::add_prec_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::add_round_ref_val instead. If both of these things are true, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact addition.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_prec_round_val_ref(&Float::from(E), 5, Floor);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_val(Float::from(E), 5, Ceiling);
assert_eq!(sum.to_string(), "6.0");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_prec_round_ref_val(Float::from(E), 5, Nearest);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_val(Float::from(E), 20, Floor);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_val(Float::from(E), 20, Ceiling);
assert_eq!(sum.to_string(), "5.85988");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_prec_round_ref_val(Float::from(E), 20, Nearest);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);
Source

pub fn add_prec_round_ref_ref( &self, other: &Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Adds two Floats, rounding the result to the specified precision and with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\infty,-\infty,p,m)=f(-\infty,\infty,p,m)= \text{NaN}$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,p,m)=0.0$
  • $f(-0.0,-0.0,p,m)=-0.0$
  • $f(0.0,-0.0,p,m)=f(-0.0,0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,-0.0,p,m)=f(-0.0,0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,-x,p,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,-x,p,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::add_prec_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::add_round_ref_ref instead. If both of these things are true, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact addition.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 5, Floor);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 5, Ceiling);
assert_eq!(sum.to_string(), "6.0");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 5, Nearest);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 20, Floor);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 20, Ceiling);
assert_eq!(sum.to_string(), "5.85988");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_prec_round_ref_ref(&Float::from(E), 20, Nearest);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);
Source

pub fn add_prec_ref_val(&self, other: Float, prec: u64) -> (Float, Ordering)

Adds two Floats, rounding the result to the nearest value of the specified precision. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the sum is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\infty,-\infty,p)=f(-\infty,\infty,p)=\text{NaN}$
  • $f(\infty,x,p)=f(x,\infty,p)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p)=f(x,-\infty,p)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,p)=0.0$
  • $f(-0.0,-0.0,p)=-0.0$
  • $f(0.0,-0.0,p)=f(-0.0,0.0,p)=0.0$
  • $f(x,-x,p)=0.0$ if $x$ is finite and nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::add_prec_round_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = (&Float::from(PI)).add_prec_ref_val(Float::from(E), 5);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = (&Float::from(PI)).add_prec_ref_val(Float::from(E), 20);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);
Source

pub fn add_prec_ref_ref(&self, other: &Float, prec: u64) -> (Float, Ordering)

Adds two Floats, rounding the result to the nearest value of the specified precision. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the sum is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\infty,-\infty,p)=f(-\infty,\infty,p)=\text{NaN}$
  • $f(\infty,x,p)=f(x,\infty,p)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p)=f(x,-\infty,p)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,p)=0.0$
  • $f(-0.0,-0.0,p)=-0.0$
  • $f(0.0,-0.0,p)=f(-0.0,0.0,p)=0.0$
  • $f(x,-x,p)=0.0$ if $x$ is finite and nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::add_prec_round_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = (&Float::from(PI)).add_prec_ref_ref(&Float::from(E), 5);
assert_eq!(sum.to_string(), "5.8");
assert_eq!(o, Less);

let (sum, o) = (&Float::from(PI)).add_prec_ref_ref(&Float::from(E), 20);
assert_eq!(sum.to_string(), "5.85987");
assert_eq!(o, Less);
Source

pub fn add_round_ref_val( &self, other: Float, rm: RoundingMode, ) -> (Float, Ordering)

Adds two Floats, rounding the result with the specified rounding mode. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\infty,-\infty,m)=f(-\infty,\infty,m)= \text{NaN}$
  • $f(\infty,x,m)=f(x,\infty,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=f(x,-\infty,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,m)=0.0$
  • $f(-0.0,-0.0,m)=-0.0$
  • $f(0.0,-0.0,m)=f(-0.0,0.0,m)=0.0$ if $m$ is not Floor
  • $f(0.0,-0.0,m)=f(-0.0,0.0,m)=-0.0$ if $m$ is Floor
  • $f(0.0,x,m)=f(x,0.0,m)=f(-0.0,x,m)=f(x,-0.0,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,-x,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,-x,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::add_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is self.significant_bits().

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = (&Float::from(PI)).add_round_ref_val(Float::from(E), Floor);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);

let (sum, o) = (&Float::from(PI)).add_round_ref_val(Float::from(E), Ceiling);
assert_eq!(sum.to_string(), "5.859874482048839");
assert_eq!(o, Greater);

let (sum, o) = (&Float::from(PI)).add_round_ref_val(Float::from(E), Nearest);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);
Source

pub fn add_round_ref_ref( &self, other: &Float, rm: RoundingMode, ) -> (Float, Ordering)

Adds two Floats, rounding the result with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\infty,-\infty,m)=f(-\infty,\infty,m)= \text{NaN}$
  • $f(\infty,x,m)=f(x,\infty,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=f(x,-\infty,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0.0,m)=0.0$
  • $f(-0.0,-0.0,m)=-0.0$
  • $f(0.0,-0.0,m)=f(-0.0,0.0,m)=0.0$ if $m$ is not Floor
  • $f(0.0,-0.0,m)=f(-0.0,0.0,m)=-0.0$ if $m$ is Floor
  • $f(0.0,x,m)=f(x,0.0,m)=f(-0.0,x,m)=f(x,-0.0,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,-x,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,-x,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::add_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using + instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_round_ref_ref(&Float::from(E), Floor);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_round_ref_ref(&Float::from(E), Ceiling);
assert_eq!(sum.to_string(), "5.859874482048839");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_round_ref_ref(&Float::from(E), Nearest);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);
Source

pub fn add_rational_prec_round_ref_val( &self, other: Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$
  • $f(-\infty,x,p,m)=-\infty$
  • $f(0.0,0,p,m)=0.0$
  • $f(-0.0,0,p,m)=-0.0$
  • $f(x,-x,p,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,-x,p,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::add_rational_prec_ref_val instead. If you know that your target precision is the precision of the Float input, consider using Float::add_rational_round_ref_val instead. If both of these things are true, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact addition.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(sum.to_string(), "3.4");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(sum.to_string(), "3.5");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(sum.to_string(), "3.5");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(sum.to_string(), "3.474922");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(sum.to_string(), "3.474926");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(sum.to_string(), "3.474926");
assert_eq!(o, Greater);
Source

pub fn add_rational_prec_round_ref_ref( &self, other: &Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float and the Rational are both taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$
  • $f(-\infty,x,p,m)=-\infty$
  • $f(0.0,0,p,m)=0.0$
  • $f(-0.0,0,p,m)=-0.0$
  • $f(x,-x,p,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,-x,p,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::add_rational_prec_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using Float::add_rational_round_ref_ref instead. If both of these things are true, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact addition.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(sum.to_string(), "3.4");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(sum.to_string(), "3.5");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(sum.to_string(), "3.5");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(sum.to_string(), "3.474922");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(sum.to_string(), "3.474926");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(sum.to_string(), "3.474926");
assert_eq!(o, Greater);
Source

pub fn add_rational_prec_ref_val( &self, other: Rational, prec: u64, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result to the nearest value of the specified precision. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the sum is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$
  • $f(-\infty,x,p)=-\infty$
  • $f(0.0,0,p)=0.0$
  • $f(-0.0,0,p)=-0.0$
  • $f(x,-x,p)=0.0$ if $x$ is nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::add_rational_prec_round_ref_val instead. If you know that your target precision is the precision of the Float input, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_rational_prec_ref_val(Rational::exact_from(1.5), 5);
assert_eq!(sum.to_string(), "4.8");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_ref_val(Rational::exact_from(1.5), 20);
assert_eq!(sum.to_string(), "4.641594");
assert_eq!(o, Greater);
Source

pub fn add_rational_prec_ref_ref( &self, other: &Rational, prec: u64, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result to the nearest value of the specified precision. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the sum is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$
  • $f(-\infty,x,p)=-\infty$
  • $f(0.0,0,p)=0.0$
  • $f(-0.0,0,p)=-0.0$
  • $f(x,-x,p)=0.0$ if $x$ is nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::add_rational_prec_round_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).add_rational_prec_ref_ref(&Rational::exact_from(1.5), 5);
assert_eq!(sum.to_string(), "4.8");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).add_rational_prec_ref_ref(&Rational::exact_from(1.5), 20);
assert_eq!(sum.to_string(), "4.641594");
assert_eq!(o, Greater);
Source

pub fn add_rational_round_ref_val( &self, other: Rational, rm: RoundingMode, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result with the specified rounding mode. The Float is taken by reference and the Float by value. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0,m)=0.0$
  • $f(-0.0,0,m)=-0.0$
  • $f(0.0,x,m)=f(x,0,m)=f(-0.0,x,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,-x,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,-x,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::add_rational_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) =
    Float::from(PI).add_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(sum.to_string(), "3.474925986923125");
assert_eq!(o, Less);

let (sum, o) =
    Float::from(PI).add_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(sum.to_string(), "3.474925986923129");
assert_eq!(o, Greater);

let (sum, o) =
    Float::from(PI).add_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(sum.to_string(), "3.474925986923125");
assert_eq!(o, Less);
Source

pub fn add_rational_round_ref_ref( &self, other: &Rational, rm: RoundingMode, ) -> (Float, Ordering)

Adds a Float and a Rational, rounding the result with the specified rounding mode. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded sum is less than, equal to, or greater than the exact sum. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x+y+\varepsilon. $$

  • If $x+y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x+y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x+y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x+y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0,m)=0.0$
  • $f(-0.0,0,m)=-0.0$
  • $f(0.0,x,m)=f(x,0,m)=f(-0.0,x,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,-x,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,-x,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::add_rational_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using + instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) =
    Float::from(PI).add_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(sum.to_string(), "3.474925986923125");
assert_eq!(o, Less);

let (sum, o) =
    Float::from(PI).add_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(sum.to_string(), "3.474925986923129");
assert_eq!(o, Greater);

let (sum, o) =
    Float::from(PI).add_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(sum.to_string(), "3.474925986923125");
assert_eq!(o, Less);
Source

pub fn div_prec_round_ref_val( &self, other: Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Divides two Floats, rounding the result to the specified precision and with the specified rounding mode. The first Float is are taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,p,m)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,p,m)=\infty$ if $x>0.0$
  • $f(x,0.0,p,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p,m)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,p,m)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,p,m)=-\infty$ if $x>0.0$
  • $f(x,-0.0,p,m)=\infty$ if $x<0.0$
  • $f(0.0,x,p,m)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,p,m)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p,m)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,p,m)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you know you’ll be using Nearest, consider using Float::div_prec_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::div_round_ref_val instead. If both of these things are true, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact division.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 5, Floor);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 5, Ceiling);
assert_eq!(quotient.to_string(), "1.19");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 5, Nearest);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 20, Floor);
assert_eq!(quotient.to_string(), "1.155725");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 20, Ceiling);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_prec_round_ref_val(Float::from(E), 20, Nearest);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);
Source

pub fn div_prec_round_ref_ref( &self, other: &Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Divides two Floats, rounding the result to the specified precision and with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,p,m)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,p,m)=\infty$ if $x>0.0$
  • $f(x,0.0,p,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p,m)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,p,m)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,p,m)=-\infty$ if $x>0.0$
  • $f(x,-0.0,p,m)=\infty$ if $x<0.0$
  • $f(0.0,x,p,m)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,p,m)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p,m)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,p,m)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you know you’ll be using Nearest, consider using Float::div_prec_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::div_round_ref_ref instead. If both of these things are true, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact division.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 5, Floor);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 5, Ceiling);
assert_eq!(quotient.to_string(), "1.19");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 5, Nearest);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 20, Floor);
assert_eq!(quotient.to_string(), "1.155725");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 20, Ceiling);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_prec_round_ref_ref(&Float::from(E), 20, Nearest);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);
Source

pub fn div_prec_ref_val(&self, other: Float, prec: u64) -> (Float, Ordering)

Divides two Floats, rounding the result to the nearest value of the specified precision. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the quotient is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,p)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,p)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,p)=\infty$ if $x>0.0$
  • $f(x,0.0,p)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,p)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,p)=-\infty$ if $x>0.0$
  • $f(x,-0.0,p)=\infty$ if $x<0.0$
  • $f(0.0,x,p)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,p)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,p)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you want to use a rounding mode other than Nearest, consider using Float::div_prec_round_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_prec_ref_val(Float::from(E), 5);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_ref_val(Float::from(E), 20);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);
Source

pub fn div_prec_ref_ref(&self, other: &Float, prec: u64) -> (Float, Ordering)

Divides two Floats, rounding the result to the nearest value of the specified precision. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the quotient is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,p)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,p)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,p)=\infty$ if $x>0.0$
  • $f(x,0.0,p)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,p)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,p)=-\infty$ if $x>0.0$
  • $f(x,-0.0,p)=\infty$ if $x<0.0$
  • $f(0.0,x,p)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,p)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,p)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you want to use a rounding mode other than Nearest, consider using Float::div_prec_round_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_prec_ref_ref(&Float::from(E), 5);
assert_eq!(quotient.to_string(), "1.12");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_prec_ref_ref(&Float::from(E), 20);
assert_eq!(quotient.to_string(), "1.155727");
assert_eq!(o, Greater);
Source

pub fn div_round_ref_val( &self, other: Float, rm: RoundingMode, ) -> (Float, Ordering)

Divides two Floats, rounding the result with the specified rounding mode. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,m)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,m)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,m)=\infty$ if $x>0.0$
  • $f(x,0.0,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,m)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,m)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,m)=-\infty$ if $x>0.0$
  • $f(x,-0.0,m)=\infty$ if $x<0.0$
  • $f(0.0,x,m)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,m)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,m)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,m)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you want to specify an output precision, consider using Float::div_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_round_ref_val(Float::from(E), Floor);
assert_eq!(quotient.to_string(), "1.1557273497909217");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_round_ref_val(Float::from(E), Ceiling);
assert_eq!(quotient.to_string(), "1.155727349790922");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_round_ref_val(Float::from(E), Nearest);
assert_eq!(quotient.to_string(), "1.1557273497909217");
assert_eq!(o, Less);
Source

pub fn div_round_ref_ref( &self, other: &Float, rm: RoundingMode, ) -> (Float, Ordering)

Divides two Floats, rounding the result with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm\infty,p,m)=f(\pm0.0,\pm0.0,p,m) = \text{NaN}$
  • $f(\infty,x,m)=\infty$ if $0.0<x<\infty$
  • $f(\infty,x,m)=-\infty$ if $-\infty<x<0.0$
  • $f(x,0.0,m)=\infty$ if $x>0.0$
  • $f(x,0.0,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,m)=-\infty$ if $0.0<x<\infty$
  • $f(-\infty,x,m)=\infty$ if $-\infty<x<0.0$
  • $f(x,-0.0,m)=-\infty$ if $x>0.0$
  • $f(x,-0.0,m)=\infty$ if $x<0.0$
  • $f(0.0,x,m)=0.0$ if $x$ is not NaN and $x>0.0$
  • $f(0.0,x,m)=-0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,\infty,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,\infty,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,m)=-0.0$ if $x$ is not NaN and $x>0.0$
  • $f(-0.0,x,m)=0.0$ if $x$ is not NaN and $x<0.0$
  • $f(x,-\infty,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(x,-\infty,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

If you want to specify an output precision, consider using Float::div_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_round_ref_ref(&Float::from(E), Floor);
assert_eq!(quotient.to_string(), "1.1557273497909217");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_round_ref_ref(&Float::from(E), Ceiling);
assert_eq!(quotient.to_string(), "1.155727349790922");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_round_ref_ref(&Float::from(E), Nearest);
assert_eq!(quotient.to_string(), "1.1557273497909217");
assert_eq!(o, Less);
Source

pub fn div_rational_prec_round_ref_val( &self, other: Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(\pm\infty,0,p,m)=f(\pm0.0,0,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x\geq 0$
  • $f(\infty,x,p,m)=-\infty$ if $x<0$
  • $f(-\infty,x,p,m)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,p,m)=\infty$ if $x<0$
  • $f(0.0,x,p,m)=0.0$ if $x>0$
  • $f(0.0,x,p,m)=-0.0$ if $x<0$
  • $f(-0.0,x,p,m)=-0.0$ if $x>0$
  • $f(-0.0,x,p,m)=0.0$ if $x<0$

If you know you’ll be using Nearest, consider using Float::div_rational_prec_ref_val instead. If you know that your target precision is the precision of the Float input, consider using Float::div_rational_round_ref_val instead. If both of these things are true, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact division.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(quotient.to_string(), "9.0");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(quotient.to_string(), "9.5");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(quotient.to_string(), "9.5");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(quotient.to_string(), "9.42477");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(quotient.to_string(), "9.42479");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(quotient.to_string(), "9.42477");
assert_eq!(o, Less);
Source

pub fn div_rational_prec_round_ref_ref( &self, other: &Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float and the Rational are both taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(\pm\infty,0,p,m)=f(\pm0.0,0,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x\geq 0$
  • $f(\infty,x,p,m)=-\infty$ if $x<0$
  • $f(-\infty,x,p,m)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,p,m)=\infty$ if $x<0$
  • $f(0.0,x,p,m)=0.0$ if $x>0$
  • $f(0.0,x,p,m)=-0.0$ if $x<0$
  • $f(-0.0,x,p,m)=-0.0$ if $x>0$
  • $f(-0.0,x,p,m)=0.0$ if $x<0$

If you know you’ll be using Nearest, consider using Float::div_rational_prec_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using Float::div_rational_round_ref_ref instead. If both of these things are true, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact division.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(quotient.to_string(), "9.0");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(quotient.to_string(), "9.5");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(quotient.to_string(), "9.5");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(quotient.to_string(), "9.42477");
assert_eq!(o, Less);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(quotient.to_string(), "9.42479");
assert_eq!(o, Greater);

let (quotient, o) = Float::from(PI).div_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(quotient.to_string(), "9.42477");
assert_eq!(o, Less);
Source

pub fn div_rational_prec_ref_val( &self, other: Rational, prec: u64, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the quotient is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(\pm\infty,0,p)=f(\pm0.0,0,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x\geq 0$
  • $f(\infty,x,p)=-\infty$ if $x<0$
  • $f(-\infty,x,p)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,p)=\infty$ if $x<0$
  • $f(0.0,x,p)=0.0$ if $x>0$
  • $f(0.0,x,p)=-0.0$ if $x<0$
  • $f(-0.0,x,p)=-0.0$ if $x>0$
  • $f(-0.0,x,p)=0.0$ if $x<0$

If you want to use a rounding mode other than Nearest, consider using Float::div_rational_prec_round_ref_val instead. If you know that your target precision is the precision of the Float input, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) = Float::from(PI).div_rational_prec_ref_val(Rational::exact_from(1.5), 5);
assert_eq!(quotient.to_string(), "2.1");
assert_eq!(o, Greater);

let (quotient, o) =
    Float::from(PI).div_rational_prec_ref_val(Rational::exact_from(1.5), 20);
assert_eq!(quotient.to_string(), "2.094395");
assert_eq!(o, Less);
Source

pub fn div_rational_prec_ref_ref( &self, other: &Rational, prec: u64, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the quotient is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(\pm\infty,0,p)=f(\pm0.0,0,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x\geq 0$
  • $f(\infty,x,p)=-\infty$ if $x<0$
  • $f(-\infty,x,p)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,p)=\infty$ if $x<0$
  • $f(0.0,x,p)=0.0$ if $x>0$
  • $f(0.0,x,p)=-0.0$ if $x<0$
  • $f(-0.0,x,p)=-0.0$ if $x>0$
  • $f(-0.0,x,p)=0.0$ if $x<0$

If you want to use a rounding mode other than Nearest, consider using Float::div_rational_prec_round_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) =
    Float::from(PI).div_rational_prec_ref_ref(&Rational::exact_from(1.5), 5);
assert_eq!(quotient.to_string(), "2.1");
assert_eq!(o, Greater);

let (quotient, o) =
    Float::from(PI).div_rational_prec_ref_ref(&Rational::exact_from(1.5), 20);
assert_eq!(quotient.to_string(), "2.094395");
assert_eq!(o, Less);
Source

pub fn div_rational_round_ref_val( &self, other: Rational, rm: RoundingMode, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=f(\pm\infty,0,m)=f(\pm0.0,0,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x\geq 0$
  • $f(\infty,x,m)=-\infty$ if $x<0$
  • $f(-\infty,x,m)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,m)=\infty$ if $x<0$
  • $f(0.0,x,m)=0.0$ if $x>0$
  • $f(0.0,x,m)=-0.0$ if $x<0$
  • $f(-0.0,x,m)=-0.0$ if $x>0$
  • $f(-0.0,x,m)=0.0$ if $x<0$

If you want to specify an output precision, consider using Float::div_rational_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(quotient.to_string(), "9.42477796076938");
assert_eq!(o, Less);

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(quotient.to_string(), "9.42477796076939");
assert_eq!(o, Greater);

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(quotient.to_string(), "9.42477796076938");
assert_eq!(o, Less);
Source

pub fn div_rational_round_ref_ref( &self, other: &Rational, rm: RoundingMode, ) -> (Float, Ordering)

Divides a Float by a Rational, rounding the result with the specified rounding mode. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded quotient is less than, equal to, or greater than the exact quotient. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x/y+\varepsilon. $$

  • If $x/y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x/y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x/y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x/y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=f(\pm\infty,0,m)=f(\pm0.0,0,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x\geq 0$
  • $f(\infty,x,m)=-\infty$ if $x<0$
  • $f(-\infty,x,m)=-\infty$ if $x\geq 0$
  • $f(-\infty,x,m)=\infty$ if $x<0$
  • $f(0.0,x,m)=0.0$ if $x>0$
  • $f(0.0,x,m)=-0.0$ if $x<0$
  • $f(-0.0,x,m)=-0.0$ if $x>0$
  • $f(-0.0,x,m)=0.0$ if $x<0$

If you want to specify an output precision, consider using Float::div_rational_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using / instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(quotient.to_string(), "9.42477796076938");
assert_eq!(o, Less);

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(quotient.to_string(), "9.42477796076939");
assert_eq!(o, Greater);

let (quotient, o) =
    Float::from(PI).div_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(quotient.to_string(), "9.42477796076938");
assert_eq!(o, Less);
Source

pub fn mul_prec_round_ref_val( &self, other: Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies two Floats, rounding the result to the specified precision and with the specified rounding mode. The first Float is are taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm0.0,p,m)=f(\pm0.0,\pm\infty,p,m) = \text{NaN}$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=\infty$ if $x>0.0$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=-\infty$ if $x>0.0$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=\infty$ if $x<0.0$
  • $f(0.0,x,p,m)=f(x,0.0,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,p,m)=f(x,0.0,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p,m)=f(x,-0.0,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,p,m)=f(x,-0.0,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::mul_prec_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::mul_round_ref_val instead. If both of these things are true, consider using * instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact multiplication.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 5, Floor);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 5, Ceiling);
assert_eq!(product.to_string(), "9.0");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 5, Nearest);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 20, Floor);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 20, Ceiling);
assert_eq!(product.to_string(), "8.53975");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_prec_round_ref_val(Float::from(E), 20, Nearest);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);
Source

pub fn mul_prec_round_ref_ref( &self, other: &Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies two Floats, rounding the result to the specified precision and with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\pm\infty,\pm0.0,p,m)=f(\pm0.0,\pm\infty,p,m) = \text{NaN}$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=\infty$ if $x>0.0$
  • $f(\infty,x,p,m)=f(x,\infty,p,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=-\infty$ if $x>0.0$
  • $f(-\infty,x,p,m)=f(x,-\infty,p,m)=\infty$ if $x<0.0$
  • $f(0.0,x,p,m)=f(x,0.0,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,p,m)=f(x,0.0,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p,m)=f(x,-0.0,p,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,p,m)=f(x,-0.0,p,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::mul_prec_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::mul_round_ref_ref instead. If both of these things are true, consider using * instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact multiplication.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 5, Floor);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 5, Ceiling);
assert_eq!(product.to_string(), "9.0");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 5, Nearest);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 20, Floor);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 20, Ceiling);
assert_eq!(product.to_string(), "8.53975");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_prec_round_ref_ref(&Float::from(E), 20, Nearest);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);
Source

pub fn mul_prec_ref_val(&self, other: Float, prec: u64) -> (Float, Ordering)

Multiplies two Floats, rounding the result to the nearest value of the specified precision. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the product is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\pm\infty,\pm0.0,p)=f(\pm0.0,\pm\infty,p) = \text{NaN}$
  • $f(\infty,x,p)=f(x,\infty,p)=\infty$ if $x>0.0$
  • $f(\infty,x,p)=f(x,\infty,p)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p)=f(x,-\infty,p)=-\infty$ if $x>0.0$
  • $f(-\infty,x,p)=f(x,-\infty,p)=\infty$ if $x<0.0$
  • $f(0.0,x,p)=f(x,0.0,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,p)=f(x,0.0,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p)=f(x,-0.0,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,p)=f(x,-0.0,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::mul_prec_round_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using * instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_prec_ref_val(Float::from(E), 5);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_ref_val(Float::from(E), 20);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);
Source

pub fn mul_prec_ref_ref(&self, other: &Float, prec: u64) -> (Float, Ordering)

Multiplies two Floats, rounding the result to the nearest value of the specified precision. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the product is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\pm\infty,\pm0.0,p)=f(\pm0.0,\pm\infty,p) = \text{NaN}$
  • $f(\infty,x,p)=f(x,\infty,p)=\infty$ if $x>0.0$
  • $f(\infty,x,p)=f(x,\infty,p)=-\infty$ if $x<0.0$
  • $f(-\infty,x,p)=f(x,-\infty,p)=-\infty$ if $x>0.0$
  • $f(-\infty,x,p)=f(x,-\infty,p)=\infty$ if $x<0.0$
  • $f(0.0,x,p)=f(x,0.0,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,p)=f(x,0.0,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,p)=f(x,-0.0,p)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,p)=f(x,-0.0,p)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::mul_prec_round_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using * instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_prec_ref_ref(&Float::from(E), 5);
assert_eq!(product.to_string(), "8.5");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_prec_ref_ref(&Float::from(E), 20);
assert_eq!(product.to_string(), "8.53973");
assert_eq!(o, Less);
Source

pub fn mul_round_ref_val( &self, other: Float, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies two Floats, rounding the result with the specified rounding mode. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\pm\infty,\pm0.0,m)=f(\pm0.0,\pm\infty,m) = \text{NaN}$
  • $f(\infty,x,m)=f(x,\infty,m)=\infty$ if $x>0.0$
  • $f(\infty,x,m)=f(x,\infty,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,m)=f(x,-\infty,m)=-\infty$ if $x>0.0$
  • $f(-\infty,x,m)=f(x,-\infty,m)=\infty$ if $x<0.0$
  • $f(0.0,x,m)=f(x,0.0,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,m)=f(x,0.0,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,m)=f(x,-0.0,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,m)=f(x,-0.0,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::mul_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_round_ref_val(Float::from(E), Floor);
assert_eq!(product.to_string(), "8.539734222673566");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_round_ref_val(Float::from(E), Ceiling);
assert_eq!(product.to_string(), "8.539734222673568");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_round_ref_val(Float::from(E), Nearest);
assert_eq!(product.to_string(), "8.539734222673566");
assert_eq!(o, Less);
Source

pub fn mul_round_ref_ref( &self, other: &Float, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies two Floats, rounding the result with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\pm\infty,\pm0.0,m)=f(\pm0.0,\pm\infty,m) = \text{NaN}$
  • $f(\infty,x,m)=f(x,\infty,m)=\infty$ if $x>0.0$
  • $f(\infty,x,m)=f(x,\infty,m)=-\infty$ if $x<0.0$
  • $f(-\infty,x,m)=f(x,-\infty,m)=-\infty$ if $x>0.0$
  • $f(-\infty,x,m)=f(x,-\infty,m)=\infty$ if $x<0.0$
  • $f(0.0,x,m)=f(x,0.0,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(0.0,x,m)=f(x,0.0,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$
  • $f(-0.0,x,m)=f(x,-0.0,m)=-0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=0.0$ or $x>0.0$
  • $f(-0.0,x,m)=f(x,-0.0,m)=0.0$ if $x$ is not NaN or $\pm\infty$, and if $x=-0.0$ or $x<0.0$

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::mul_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_round_ref_ref(&Float::from(E), Floor);
assert_eq!(product.to_string(), "8.539734222673566");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_round_ref_ref(&Float::from(E), Ceiling);
assert_eq!(product.to_string(), "8.539734222673568");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_round_ref_ref(&Float::from(E), Nearest);
assert_eq!(product.to_string(), "8.539734222673566");
assert_eq!(o, Less);
Source

pub fn mul_rational_prec_round_ref_val( &self, other: Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(\pm\infty,0,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x>0$
  • $f(\infty,x,p,m)=-\infty$ if $x<0$
  • $f(-\infty,x,p,m)=-\infty$ if $x>0$
  • $f(-\infty,x,p,m)=\infty$ if $x<0$
  • $f(0.0,x,p,m)=0.0$ if $x\geq0$
  • $f(0.0,x,p,m)=-0.0$ if $x<0$
  • $f(-0.0,x,p,m)=-0.0$ if $x\geq0$
  • $f(-0.0,x,p,m)=0.0$ if $x<0$

If you know you’ll be using Nearest, consider using Float::mul_rational_prec_ref_val instead. If you know that your target precision is the precision of the Float input, consider using Float::mul_rational_round_ref_val instead. If both of these things are true, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact multiplication.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(product.to_string(), "1.0");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(product.to_string(), "1.06");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(product.to_string(), "1.06");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(product.to_string(), "1.047197");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(product.to_string(), "1.047199");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(product.to_string(), "1.047197");
assert_eq!(o, Less);
Source

pub fn mul_rational_prec_round_ref_ref( &self, other: &Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float and the Rational are both taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(\pm\infty,0,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x>0$
  • $f(\infty,x,p,m)=-\infty$ if $x<0$
  • $f(-\infty,x,p,m)=-\infty$ if $x>0$
  • $f(-\infty,x,p,m)=\infty$ if $x<0$
  • $f(0.0,x,p,m)=0.0$ if $x\geq0$
  • $f(0.0,x,p,m)=-0.0$ if $x<0$
  • $f(-0.0,x,p,m)=-0.0$ if $x\geq0$
  • $f(-0.0,x,p,m)=0.0$ if $x<0$

If you know you’ll be using Nearest, consider using Float::mul_rational_prec_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using Float::mul_rational_round_ref_ref instead. If both of these things are true, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact multiplication.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(product.to_string(), "1.0");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(product.to_string(), "1.06");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(product.to_string(), "1.06");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(product.to_string(), "1.047197");
assert_eq!(o, Less);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(product.to_string(), "1.047199");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(product.to_string(), "1.047197");
assert_eq!(o, Less);
Source

pub fn mul_rational_prec_ref_val( &self, other: Rational, prec: u64, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the product is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(\pm\infty,0,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x>0$
  • $f(\infty,x,p)=-\infty$ if $x<0$
  • $f(-\infty,x,p)=-\infty$ if $x>0$
  • $f(-\infty,x,p)=\infty$ if $x<0$
  • $f(0.0,x,p)=0.0$ if $x\geq0$
  • $f(0.0,x,p)=-0.0$ if $x<0$
  • $f(-0.0,x,p)=-0.0$ if $x\geq0$
  • $f(-0.0,x,p)=0.0$ if $x<0$

If you want to use a rounding mode other than Nearest, consider using Float::mul_rational_prec_round_ref_val instead. If you know that your target precision is the precision of the Float input, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_rational_prec_ref_val(Rational::exact_from(1.5), 5);
assert_eq!(product.to_string(), "4.8");
assert_eq!(o, Greater);

let (product, o) = Float::from(PI).mul_rational_prec_ref_val(Rational::exact_from(1.5), 20);
assert_eq!(product.to_string(), "4.712387");
assert_eq!(o, Less);
Source

pub fn mul_rational_prec_ref_ref( &self, other: &Rational, prec: u64, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the product is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(\pm\infty,0,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x>0$
  • $f(\infty,x,p)=-\infty$ if $x<0$
  • $f(-\infty,x,p)=-\infty$ if $x>0$
  • $f(-\infty,x,p)=\infty$ if $x<0$
  • $f(0.0,x,p)=0.0$ if $x\geq0$
  • $f(0.0,x,p)=-0.0$ if $x<0$
  • $f(-0.0,x,p)=-0.0$ if $x\geq0$
  • $f(-0.0,x,p)=0.0$ if $x<0$

If you want to use a rounding mode other than Nearest, consider using Float::mul_rational_prec_round_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) = Float::from(PI).mul_rational_prec_ref_ref(&Rational::exact_from(1.5), 5);
assert_eq!(product.to_string(), "4.8");
assert_eq!(o, Greater);

let (product, o) =
    Float::from(PI).mul_rational_prec_ref_ref(&Rational::exact_from(1.5), 20);
assert_eq!(product.to_string(), "4.712387");
assert_eq!(o, Less);
Source

pub fn mul_rational_round_ref_val( &self, other: Rational, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=f(\pm\infty,0,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x>0$
  • $f(\infty,x,m)=-\infty$ if $x<0$
  • $f(-\infty,x,m)=-\infty$ if $x>0$
  • $f(-\infty,x,m)=\infty$ if $x<0$
  • $f(0.0,x,m)=0.0$ if $x\geq0$
  • $f(0.0,x,m)=-0.0$ if $x<0$
  • $f(-0.0,x,m)=-0.0$ if $x\geq0$
  • $f(-0.0,x,m)=0.0$ if $x<0$

If you want to specify an output precision, consider using Float::mul_rational_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) =
    Float::from(PI).mul_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(product.to_string(), "1.047197551196597");
assert_eq!(o, Less);

let (product, o) =
    Float::from(PI).mul_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(product.to_string(), "1.047197551196598");
assert_eq!(o, Greater);

let (product, o) =
    Float::from(PI).mul_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(product.to_string(), "1.047197551196598");
assert_eq!(o, Greater);
Source

pub fn mul_rational_round_ref_ref( &self, other: &Rational, rm: RoundingMode, ) -> (Float, Ordering)

Multiplies a Float by a Rational, rounding the result with the specified rounding mode. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded product is less than, equal to, or greater than the exact product. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = xy+\varepsilon. $$

  • If $xy$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $xy$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $xy$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |xy|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=f(\pm\infty,0,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x>0$
  • $f(\infty,x,m)=-\infty$ if $x<0$
  • $f(-\infty,x,m)=-\infty$ if $x>0$
  • $f(-\infty,x,m)=\infty$ if $x<0$
  • $f(0.0,x,m)=0.0$ if $x\geq0$
  • $f(0.0,x,m)=-0.0$ if $x<0$
  • $f(-0.0,x,m)=-0.0$ if $x\geq0$
  • $f(-0.0,x,m)=0.0$ if $x<0$

If you want to specify an output precision, consider using Float::mul_rational_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using * instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (product, o) =
    Float::from(PI).mul_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(product.to_string(), "1.047197551196597");
assert_eq!(o, Less);

let (product, o) =
    Float::from(PI).mul_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(product.to_string(), "1.047197551196598");
assert_eq!(o, Greater);

let (product, o) =
    Float::from(PI).mul_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(product.to_string(), "1.047197551196598");
assert_eq!(o, Greater);
Source

pub fn reciprocal_prec_round_ref( &self, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Takes the reciprocal of a Float, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded reciprocal is less than, equal to, or greater than the exact reciprocal. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,p,m) = 1/x+\varepsilon. $$

  • If $1/x$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $1/x$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |1/x|\rfloor-p+1}$.
  • If $1/x$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |1/x|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},p,m)=\text{NaN}$
  • $f(\infty,p,m)=0.0$
  • $f(-\infty,p,m)=-0.0$
  • $f(0.0,p,m)=\infty$
  • $f(-0.0,p,m)=-\infty$

If you know you’ll be using Nearest, consider using Float::reciprocal_prec_ref instead. If you know that your target precision is the precision of the input, consider using Float::reciprocal_round_ref instead. If both of these things are true, consider using (&Float)::reciprocal() instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact reciprocation.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(5, Floor);
assert_eq!(reciprocal.to_string(), "0.31");
assert_eq!(o, Less);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(5, Ceiling);
assert_eq!(reciprocal.to_string(), "0.33");
assert_eq!(o, Greater);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(5, Nearest);
assert_eq!(reciprocal.to_string(), "0.31");
assert_eq!(o, Less);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(20, Floor);
assert_eq!(reciprocal.to_string(), "0.3183098");
assert_eq!(o, Less);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(20, Ceiling);
assert_eq!(reciprocal.to_string(), "0.3183103");
assert_eq!(o, Greater);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_round_ref(20, Nearest);
assert_eq!(reciprocal.to_string(), "0.3183098");
assert_eq!(o, Less);
Source

pub fn reciprocal_prec_ref(&self, prec: u64) -> (Float, Ordering)

Takes the reciprocal of a Float, rounding the result to the nearest value of the specified precision. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded reciprocal is less than, equal to, or greater than the exact reciprocal. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the reciprocal is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,p) = 1/x+\varepsilon. $$

  • If $1/x$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $1/x$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |1/x|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},p)=\text{NaN}$
  • $f(\infty,p)=0.0$
  • $f(-\infty,p)=-0.0$
  • $f(0.0,p)=\infty$
  • $f(-0.0,p)=-\infty$

If you want to use a rounding mode other than Nearest, consider using Float::reciprocal_prec_round_ref instead. If you know that your target precision is the precision of the input, consider using (&Float)::reciprocal() instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (reciprocal, o) = Float::from(PI).reciprocal_prec_ref(5);
assert_eq!(reciprocal.to_string(), "0.31");
assert_eq!(o, Less);

let (reciprocal, o) = Float::from(PI).reciprocal_prec_ref(20);
assert_eq!(reciprocal.to_string(), "0.3183098");
assert_eq!(o, Less);
Source

pub fn reciprocal_round_ref(&self, rm: RoundingMode) -> (Float, Ordering)

Takes the reciprocal of a Float, rounding the result with the specified rounding mode. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded reciprocal is less than, equal to, or greater than the exact reciprocal. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = 1/x+\varepsilon. $$

  • If $1/x$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $1/x$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |1/x|\rfloor-p+1}$, where $p$ is the precision of the input.
  • If $1/x$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |1/x|\rfloor-p}$, where $p$ is the precision of the input.

If the output has a precision, it is the precision of the input.

Special cases:

  • $f(\text{NaN},m)=\text{NaN}$
  • $f(\infty,m)=0.0$
  • $f(-\infty,m)=-0.0$
  • $f(0.0,m)=\infty$
  • $f(-0.0,m)=-\infty$

If you want to specify an output precision, consider using Float::reciprocal_prec_round_ref instead. If you know you’ll be using the Nearest rounding mode, consider using (&Float)::reciprocal() instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Panics

Panics if rm is Exact but the precision of the input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (reciprocal, o) = Float::from(PI).reciprocal_round_ref(Floor);
assert_eq!(reciprocal.to_string(), "0.3183098861837905");
assert_eq!(o, Less);

let (reciprocal, o) = Float::from(PI).reciprocal_round_ref(Ceiling);
assert_eq!(reciprocal.to_string(), "0.318309886183791");
assert_eq!(o, Greater);

let (reciprocal, o) = Float::from(PI).reciprocal_round_ref(Nearest);
assert_eq!(reciprocal.to_string(), "0.3183098861837905");
assert_eq!(o, Less);
Source

pub fn square_prec_round_ref( &self, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Squares a Float, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded square is less than, equal to, or greater than the exact square. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,p,m) = x^2+\varepsilon. $$

  • If $x^2$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x^2$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x^2|\rfloor-p+1}$.
  • If $x^2$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x^2|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},p,m)=\text{NaN}$
  • $f(\pm\infty,p,m)=\infty$
  • $f(\pm0.0,p,m)=0.0$

Overflow and underflow:

  • If $f(x,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::square_prec_ref instead. If you know that your target precision is the precision of the input, consider using Float::square_round_ref instead. If both of these things are true, consider using (&Float).square()instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is self.significant_bits(), and $m$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact squaring.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (square, o) = Float::from(PI).square_prec_round_ref(5, Floor);
assert_eq!(square.to_string(), "9.5");
assert_eq!(o, Less);

let (square, o) = Float::from(PI).square_prec_round_ref(5, Ceiling);
assert_eq!(square.to_string(), "10.0");
assert_eq!(o, Greater);

let (square, o) = Float::from(PI).square_prec_round_ref(5, Nearest);
assert_eq!(square.to_string(), "10.0");
assert_eq!(o, Greater);

let (square, o) = Float::from(PI).square_prec_round_ref(20, Floor);
assert_eq!(square.to_string(), "9.8696");
assert_eq!(o, Less);

let (square, o) = Float::from(PI).square_prec_round_ref(20, Ceiling);
assert_eq!(square.to_string(), "9.86961");
assert_eq!(o, Greater);

let (square, o) = Float::from(PI).square_prec_round_ref(20, Nearest);
assert_eq!(square.to_string(), "9.8696");
assert_eq!(o, Less);
Source

pub fn square_prec_ref(&self, prec: u64) -> (Float, Ordering)

Squares a Float, rounding the result to the nearest value of the specified precision. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded square is less than, equal to, or greater than the exact square. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the square is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,p) = x^2+\varepsilon. $$

  • If $x^2$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x^2$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x^2|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},p)=\text{NaN}$
  • $f(\pm\infty,p)=\infty$
  • $f(\pm0.0,p)=0.0$

Overflow and underflow:

  • If $f(x,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::square_prec_round_ref instead. If you know that your target precision is the precision of the input, consider using (&Float).square() instead.

§Worst-case complexity

$T(n, m) = O(n \log n \log\log n + m)$

$M(n, m) = O(n \log n + m)$

where $T$ is time, $M$ is additional memory, $n$ is self.significant_bits(), and $m$ is prec.

§Examples
use core::f64::consts::PI;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (square, o) = Float::from(PI).square_prec_ref(5);
assert_eq!(square.to_string(), "10.0");
assert_eq!(o, Greater);

let (square, o) = Float::from(PI).square_prec_ref(20);
assert_eq!(square.to_string(), "9.8696");
assert_eq!(o, Less);
Source

pub fn square_round_ref(&self, rm: RoundingMode) -> (Float, Ordering)

Squares a Float, rounding the result with the specified rounding mode. The Float is taken by reference. An Ordering is also returned, indicating whether the rounded square is less than, equal to, or greater than the exact square. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x^2+\varepsilon. $$

  • If $x^2$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x^2$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x^2|\rfloor-p+1}$, where $p$ is the precision of the input.
  • If $x^2$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x^2|\rfloor-p}$, where $p$ is the precision of the input.

If the output has a precision, it is the precision of the input.

Special cases:

  • $f(\text{NaN},m)=\text{NaN}$
  • $f(\pm\infty,m)=\infty$
  • $f(\pm0.0,m)=0.0$

Overflow and underflow:

  • If $f(x,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::square_prec_round_ref instead. If you know you’ll be using the Nearest rounding mode, consider using (&Float).square() instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Panics

Panics if rm is Exact but the precision of the input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (square, o) = Float::from(PI).square_round_ref(Floor);
assert_eq!(square.to_string(), "9.86960440108935");
assert_eq!(o, Less);

let (square, o) = Float::from(PI).square_round_ref(Ceiling);
assert_eq!(square.to_string(), "9.86960440108936");
assert_eq!(o, Greater);

let (square, o) = Float::from(PI).square_round_ref(Nearest);
assert_eq!(square.to_string(), "9.86960440108936");
assert_eq!(o, Greater);
Source

pub fn sub_prec_round_ref_val( &self, other: Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts two Floats, rounding the result to the specified precision and with the specified rounding mode. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\infty,\infty,p,m)=f(-\infty,-\infty,p,m)= \text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,p,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p,m)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,p,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,p,m)=0.0$
  • $f(-0.0,0.0,p,m)=-0.0$
  • $f(0.0,0.0,p,m)=f(-0.0,-0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,p,m)=f(-0.0,-0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,x,p,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,p,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::sub_prec_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::sub_round_ref_val instead. If both of these things are true, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact subtraction.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 5, Floor);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 5, Ceiling);
assert_eq!(sum.to_string(), "0.44");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 5, Nearest);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 20, Floor);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 20, Ceiling);
assert_eq!(sum.to_string(), "0.4233112");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_prec_round_ref_val(Float::from(E), 20, Nearest);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);
Source

pub fn sub_prec_round_ref_ref( &self, other: &Float, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts two Floats, rounding the result to the specified precision and with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=f(x,\text{NaN},p,m)=f(\infty,\infty,p,m)=f(-\infty,-\infty,p,m)= \text{NaN}$
  • $f(\infty,x,p,m)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,p,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p,m)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,p,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,p,m)=0.0$
  • $f(-0.0,0.0,p,m)=-0.0$
  • $f(0.0,0.0,p,m)=f(-0.0,-0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,p,m)=f(-0.0,-0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,x,p,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,p,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::sub_prec_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using Float::sub_round_ref_ref instead. If both of these things are true, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Panics

Panics if rm is Exact but prec is too small for an exact subtraction.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 5, Floor);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 5, Ceiling);
assert_eq!(sum.to_string(), "0.44");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 5, Nearest);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 20, Floor);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 20, Ceiling);
assert_eq!(sum.to_string(), "0.4233112");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_prec_round_ref_ref(&Float::from(E), 20, Nearest);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);
Source

pub fn sub_prec_ref_val(&self, other: Float, prec: u64) -> (Float, Ordering)

Subtracts two Floats, rounding the result to the nearest value of the specified precision. The first Float is taken by reference and the second by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the difference is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\infty,\infty,p)=f(-\infty,-\infty,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,p)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,p)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,p)=0.0$
  • $f(-0.0,0.0,p)=-0.0$
  • $f(0.0,0.0,p)=f(-0.0,-0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,p)=f(-0.0,-0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,x,p)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,p)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::sub_prec_round_ref_val instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_prec_ref_val(Float::from(E), 5);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_ref_val(Float::from(E), 20);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);
Source

pub fn sub_prec_ref_ref(&self, other: &Float, prec: u64) -> (Float, Ordering)

Subtracts two Floats, rounding the result to the nearest value of the specified precision. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the difference is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=f(x,\text{NaN},p)=f(\infty,\infty,p)=f(-\infty,-\infty,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,p)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,p)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,p)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,p)=0.0$
  • $f(-0.0,0.0,p)=-0.0$
  • $f(0.0,0.0,p)=f(-0.0,-0.0,p,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,p)=f(-0.0,-0.0,p,m)=-0.0$ if $m$ is Floor
  • $f(x,x,p)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,p)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::sub_prec_round_ref_ref instead. If you know that your target precision is the maximum of the precisions of the two inputs, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is prec.

§Examples
use core::f64::consts::{E, PI};
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_prec_ref_ref(&Float::from(E), 5);
assert_eq!(sum.to_string(), "0.42");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_prec_ref_ref(&Float::from(E), 20);
assert_eq!(sum.to_string(), "0.4233108");
assert_eq!(o, Less);
Source

pub fn sub_round_ref_val( &self, other: Float, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts two Floats, rounding the result with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\infty,\infty,m)=f(-\infty,-\infty,m)= \text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,m)=0.0$
  • $f(-0.0,0.0,m)=-0.0$
  • $f(0.0,0.0,m)=f(-0.0,-0.0,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,m)=f(-0.0,-0.0,m)=-0.0$ if $m$ is Floor
  • $f(x,x,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::sub_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(m)$

where $T$ is time, $M$ is additional memory, $n$ is max(self.significant_bits(), other.significant_bits()), and $m$ is self.significant_bits().

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_round_ref_val(Float::from(-E), Floor);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_round_ref_val(Float::from(-E), Ceiling);
assert_eq!(sum.to_string(), "5.859874482048839");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_round_ref_val(Float::from(-E), Nearest);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);
Source

pub fn sub_round_ref_ref( &self, other: &Float, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts two Floats, rounding the result with the specified rounding mode. Both Floats are taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the maximum of the precision of the inputs. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$, where $p$ is the maximum precision of the inputs.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$, where $p$ is the maximum precision of the inputs.

If the output has a precision, it is the maximum of the precisions of the inputs.

Special cases:

  • $f(\text{NaN},x,m)=f(x,\text{NaN},m)=f(\infty,\infty,m)=f(-\infty,-\infty,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $\infty$
  • $f(x,-\infty,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $-\infty$
  • $f(x,\infty,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,-0.0,m)=0.0$
  • $f(-0.0,0.0,m)=-0.0$
  • $f(0.0,0.0,m)=f(-0.0,-0.0,m)=0.0$ if $m$ is not Floor
  • $f(0.0,0.0,m)=f(-0.0,-0.0,m)=-0.0$ if $m$ is Floor
  • $f(x,x,m)=0.0$ if $x$ is finite and nonzero and $m$ is not Floor
  • $f(x,x,m)=-0.0$ if $x$ is finite and nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::sub_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using - instead.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the maximum precision of the inputs is not high enough to represent the output.

§Examples
use core::f64::consts::{E, PI};
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_round_ref_ref(&Float::from(-E), Floor);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_round_ref_ref(&Float::from(-E), Ceiling);
assert_eq!(sum.to_string(), "5.859874482048839");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_round_ref_ref(&Float::from(-E), Nearest);
assert_eq!(sum.to_string(), "5.859874482048838");
assert_eq!(o, Less);
Source

pub fn sub_rational_prec_round_ref_val( &self, other: Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$
  • $f(-\infty,x,p,m)=-\infty$
  • $f(0.0,0,p,m)=0.0$
  • $f(-0.0,0,p,m)=-0.0$
  • $f(x,x,p,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,x,p,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::sub_rational_prec_ref_val instead. If you know that your target precision is the precision of the Float input, consider using Float::sub_rational_round_ref_val instead. If both of these things are true, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact subtraction.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(sum.to_string(), "2.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(sum.to_string(), "2.9");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(sum.to_string(), "2.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(sum.to_string(), "2.808258");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(sum.to_string(), "2.808262");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_val(
    Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(sum.to_string(), "2.808258");
assert_eq!(o, Less);
Source

pub fn sub_rational_prec_round_ref_ref( &self, other: &Rational, prec: u64, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result to the specified precision and with the specified rounding mode. The Float and the Rational are both taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,p,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p,m)=\text{NaN}$
  • $f(\infty,x,p,m)=\infty$
  • $f(-\infty,x,p,m)=-\infty$
  • $f(0.0,0,p,m)=0.0$
  • $f(-0.0,0,p,m)=-0.0$
  • $f(x,x,p,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,x,p,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,p,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,p,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you know you’ll be using Nearest, consider using Float::sub_rational_prec_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using Float::sub_rational_round_ref_ref instead. If both of these things are true, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Panics

Panics if rm is Exact but prec is too small for an exact subtraction.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Floor,
);
assert_eq!(sum.to_string(), "2.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Ceiling,
);
assert_eq!(sum.to_string(), "2.9");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    5,
    Nearest,
);
assert_eq!(sum.to_string(), "2.8");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Floor,
);
assert_eq!(sum.to_string(), "2.808258");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Ceiling,
);
assert_eq!(sum.to_string(), "2.808262");
assert_eq!(o, Greater);

let (sum, o) = Float::from(PI).sub_rational_prec_round_ref_ref(
    &Rational::from_unsigneds(1u8, 3),
    20,
    Nearest,
);
assert_eq!(sum.to_string(), "2.808258");
assert_eq!(o, Less);
Source

pub fn sub_rational_prec_ref_val( &self, other: Rational, prec: u64, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the difference is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$
  • $f(-\infty,x,p)=-\infty$
  • $f(0.0,0,p)=0.0$
  • $f(-0.0,0,p)=-0.0$
  • $f(x,x,p)=0.0$ if $x$ is nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::sub_rational_prec_round_ref_val instead. If you know that your target precision is the precision of the Float input, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_rational_prec_ref_val(Rational::exact_from(1.5), 5);
assert_eq!(sum.to_string(), "1.62");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_ref_val(Rational::exact_from(1.5), 20);
assert_eq!(sum.to_string(), "1.641592");
assert_eq!(o, Less);
Source

pub fn sub_rational_prec_ref_ref( &self, other: &Rational, prec: u64, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result to the nearest value of the specified precision. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

If the difference is equidistant from two Floats with the specified precision, the Float with fewer 1s in its binary expansion is chosen. See RoundingMode for a description of the Nearest rounding mode.

$$ f(x,y,p) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$.

If the output has a precision, it is prec.

Special cases:

  • $f(\text{NaN},x,p)=\text{NaN}$
  • $f(\infty,x,p)=\infty$
  • $f(-\infty,x,p)=-\infty$
  • $f(0.0,0,p)=0.0$
  • $f(-0.0,0,p)=-0.0$
  • $f(x,x,p)=0.0$ if $x$ is nonzero

Overflow and underflow:

  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $\infty$ is returned instead.
  • If $f(x,y,p)\geq 2^{2^{30}-1}$, $-\infty$ is returned instead.
  • If $0<f(x,y,p)\leq2^{-2^{30}-1}$, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,p)<2^{-2^{30}}$, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,p)<0$, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,p)<-2^{-2^{30}-1}$, $-2^{-2^{30}}$ is returned instead.

If you want to use a rounding mode other than Nearest, consider using Float::sub_rational_prec_round_ref_ref instead. If you know that your target precision is the precision of the Float input, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(other.significant_bits(), prec).

§Examples
use core::f64::consts::PI;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) = Float::from(PI).sub_rational_prec_ref_ref(&Rational::exact_from(1.5), 5);
assert_eq!(sum.to_string(), "1.62");
assert_eq!(o, Less);

let (sum, o) = Float::from(PI).sub_rational_prec_ref_ref(&Rational::exact_from(1.5), 20);
assert_eq!(sum.to_string(), "1.641592");
assert_eq!(o, Less);
Source

pub fn sub_rational_round_ref_val( &self, other: Rational, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result with the specified rounding mode. The Float is taken by reference and the Rational by value. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0,m)=0.0$
  • $f(-0.0,0,m)=-0.0$
  • $f(x,0,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(0.0,x,m)=f(-0.0,x,m)=-x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,x,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,x,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::sub_rational_prec_round_ref_val instead. If you know you’ll be using the Nearest rounding mode, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(sum.to_string(), "2.808259320256457");
assert_eq!(o, Less);

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(sum.to_string(), "2.808259320256461");
assert_eq!(o, Greater);

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_val(Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(sum.to_string(), "2.808259320256461");
assert_eq!(o, Greater);
Source

pub fn sub_rational_round_ref_ref( &self, other: &Rational, rm: RoundingMode, ) -> (Float, Ordering)

Subtracts a Float by a Rational, rounding the result with the specified rounding mode. The Float and the Rational are both are taken by reference. An Ordering is also returned, indicating whether the rounded difference is less than, equal to, or greater than the exact difference. Although NaNs are not comparable to any Float, whenever this function returns a NaN it also returns Equal.

The precision of the output is the precision of the Float input. See RoundingMode for a description of the possible rounding modes.

$$ f(x,y,m) = x-y+\varepsilon. $$

  • If $x-y$ is infinite, zero, or NaN, $\varepsilon$ may be ignored or assumed to be 0.
  • If $x-y$ is finite and nonzero, and $m$ is not Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p+1}$, where $p$ is the precision of the input Float.
  • If $x-y$ is finite and nonzero, and $m$ is Nearest, then $|\varepsilon| < 2^{\lfloor\log_2 |x-y|\rfloor-p}$, where $p$ is the precision of the input Float.

If the output has a precision, it is the precision of the Float input.

Special cases:

  • $f(\text{NaN},x,m)=\text{NaN}$
  • $f(\infty,x,m)=\infty$ if $x$ is not NaN or $-\infty$
  • $f(-\infty,x,m)=-\infty$ if $x$ is not NaN or $\infty$
  • $f(0.0,0,m)=0.0$
  • $f(-0.0,0,m)=-0.0$
  • $f(x,0,m)=x$ if $x$ is not NaN and $x$ is nonzero
  • $f(0.0,x,m)=f(-0.0,x,m)=-x$ if $x$ is not NaN and $x$ is nonzero
  • $f(x,x,m)=0.0$ if $x$ is nonzero and $m$ is not Floor
  • $f(x,x,m)=-0.0$ if $x$ is nonzero and $m$ is Floor

Overflow and underflow:

  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling, Up, or Nearest, $\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor or Down, $(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Floor, Up, or Nearest, $-\infty$ is returned instead.
  • If $f(x,y,m)\geq 2^{2^{30}-1}$ and $m$ is Ceiling or Down, $-(1-(1/2)^p)2^{2^{30}-1}$ is returned instead, where p is the precision of the input.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Floor or Down, $0.0$ is returned instead.
  • If $0<f(x,y,m)<2^{-2^{30}}$, and $m$ is Ceiling or Up, $2^{-2^{30}}$ is returned instead.
  • If $0<f(x,y,m)\leq2^{-2^{30}-1}$, and $m$ is Nearest, $0.0$ is returned instead.
  • If $2^{-2^{30}-1}<f(x,y,m)<2^{-2^{30}}$, and $m$ is Nearest, $2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Ceiling or Down, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<0$, and $m$ is Floor or Up, $-2^{-2^{30}}$ is returned instead.
  • If $-2^{-2^{30}-1}\leq f(x,y,m)<0$, and $m$ is Nearest, $-0.0$ is returned instead.
  • If $-2^{-2^{30}}<f(x,y,m)<-2^{-2^{30}-1}$, and $m$ is Nearest, $-2^{-2^{30}}$ is returned instead.

If you want to specify an output precision, consider using Float::sub_rational_prec_round_ref_ref instead. If you know you’ll be using the Nearest rounding mode, consider using - instead.

§Worst-case complexity

$T(n) = O(n \log n \log\log n)$

$M(n) = O(n \log n)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Panics

Panics if rm is Exact but the precision of the Float input is not high enough to represent the output.

§Examples
use core::f64::consts::PI;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_float::Float;
use malachite_q::Rational;
use std::cmp::Ordering::*;

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Floor);
assert_eq!(sum.to_string(), "2.808259320256457");
assert_eq!(o, Less);

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Ceiling);
assert_eq!(sum.to_string(), "2.808259320256461");
assert_eq!(o, Greater);

let (sum, o) =
    Float::from(PI).sub_rational_round_ref_ref(&Rational::from_unsigneds(1u8, 3), Nearest);
assert_eq!(sum.to_string(), "2.808259320256461");
assert_eq!(o, Greater);
Source

pub fn is_nan(&self) -> bool

Determines whether a Float is NaN.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{NaN, One};
use malachite_float::Float;

assert_eq!(Float::NAN.is_nan(), true);
assert_eq!(Float::ONE.is_nan(), false);
Source

pub fn is_finite(&self) -> bool

Determines whether a Float is finite.

NaN is not finite.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, One};
use malachite_float::Float;

assert_eq!(Float::NAN.is_finite(), false);
assert_eq!(Float::INFINITY.is_finite(), false);
assert_eq!(Float::ONE.is_finite(), true);
Source

pub fn is_infinite(&self) -> bool

Determines whether a Float is infinite.

NaN is not infinite.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, One};
use malachite_float::Float;

assert_eq!(Float::NAN.is_infinite(), false);
assert_eq!(Float::INFINITY.is_infinite(), true);
assert_eq!(Float::ONE.is_infinite(), false);
Source

pub fn is_positive_zero(&self) -> bool

Determines whether a Float is positive zero.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.is_positive_zero(), false);
assert_eq!(Float::INFINITY.is_positive_zero(), false);
assert_eq!(Float::ONE.is_positive_zero(), false);
assert_eq!(Float::ZERO.is_positive_zero(), true);
assert_eq!(Float::NEGATIVE_ZERO.is_positive_zero(), false);
Source

pub fn is_negative_zero(&self) -> bool

Determines whether a Float is negative zero.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.is_negative_zero(), false);
assert_eq!(Float::INFINITY.is_negative_zero(), false);
assert_eq!(Float::ONE.is_negative_zero(), false);
assert_eq!(Float::ZERO.is_negative_zero(), false);
assert_eq!(Float::NEGATIVE_ZERO.is_negative_zero(), true);
Source

pub fn is_zero(&self) -> bool

Determines whether a Float is zero (positive or negative).

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.is_zero(), false);
assert_eq!(Float::INFINITY.is_zero(), false);
assert_eq!(Float::ONE.is_zero(), false);
assert_eq!(Float::ZERO.is_zero(), true);
assert_eq!(Float::NEGATIVE_ZERO.is_zero(), true);
Source

pub fn is_normal(&self) -> bool

Determines whether a Float is normal, that is, finite and nonzero.

There is no notion of subnormal Floats.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.is_normal(), false);
assert_eq!(Float::INFINITY.is_normal(), false);
assert_eq!(Float::ZERO.is_normal(), false);
assert_eq!(Float::NEGATIVE_ZERO.is_normal(), false);
assert_eq!(Float::ONE.is_normal(), true);
Source

pub fn is_sign_positive(&self) -> bool

Determines whether a Float’s sign is positive.

A NaN has no sign, so this function returns false when given a NaN.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, Zero,
};
use malachite_float::Float;

assert_eq!(Float::NAN.is_sign_positive(), false);
assert_eq!(Float::INFINITY.is_sign_positive(), true);
assert_eq!(Float::NEGATIVE_INFINITY.is_sign_positive(), false);
assert_eq!(Float::ZERO.is_sign_positive(), true);
assert_eq!(Float::NEGATIVE_ZERO.is_sign_positive(), false);
assert_eq!(Float::ONE.is_sign_positive(), true);
assert_eq!(Float::NEGATIVE_ONE.is_sign_positive(), false);
Source

pub fn is_sign_negative(&self) -> bool

Determines whether a Float’s sign is negative.

A NaN has no sign, so this function returns false when given a NaN.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, Zero,
};
use malachite_float::Float;

assert_eq!(Float::NAN.is_sign_negative(), false);
assert_eq!(Float::INFINITY.is_sign_negative(), false);
assert_eq!(Float::NEGATIVE_INFINITY.is_sign_negative(), true);
assert_eq!(Float::ZERO.is_sign_negative(), false);
assert_eq!(Float::NEGATIVE_ZERO.is_sign_negative(), true);
assert_eq!(Float::ONE.is_sign_negative(), false);
assert_eq!(Float::NEGATIVE_ONE.is_sign_negative(), true);
Source

pub fn classify(&self) -> FpCategory

Classifies a Float into one of several categories.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, Zero,
};
use malachite_float::Float;
use std::num::FpCategory;

assert_eq!(Float::NAN.classify(), FpCategory::Nan);
assert_eq!(Float::INFINITY.classify(), FpCategory::Infinite);
assert_eq!(Float::NEGATIVE_INFINITY.classify(), FpCategory::Infinite);
assert_eq!(Float::ZERO.classify(), FpCategory::Zero);
assert_eq!(Float::NEGATIVE_ZERO.classify(), FpCategory::Zero);
assert_eq!(Float::ONE.classify(), FpCategory::Normal);
assert_eq!(Float::NEGATIVE_ONE.classify(), FpCategory::Normal);
Source

pub fn to_non_nan(&self) -> Option<Float>

Turns a NaN into a None and wraps any non-NaN Float with a Some. The Float is taken by reference.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.to_non_nan(), None);
assert_eq!(Float::INFINITY.to_non_nan(), Some(Float::INFINITY));
assert_eq!(Float::ZERO.to_non_nan(), Some(Float::ZERO));
assert_eq!(
    Float::NEGATIVE_ZERO.to_non_nan(),
    Some(Float::NEGATIVE_ZERO)
);
assert_eq!(Float::ONE.to_non_nan(), Some(Float::ONE));
Source

pub fn to_finite(&self) -> Option<Float>

Turns any Float that’s NaN or infinite into a None and wraps any finite Float with a Some. The Float is taken by reference.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeZero, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.to_finite(), None);
assert_eq!(Float::INFINITY.to_finite(), None);
assert_eq!(Float::ZERO.to_finite(), Some(Float::ZERO));
assert_eq!(Float::NEGATIVE_ZERO.to_finite(), Some(Float::NEGATIVE_ZERO));
assert_eq!(Float::ONE.to_finite(), Some(Float::ONE));
Source

pub fn complexity(&self) -> u64

Determines a Float’s complexity. The complexity is defined as follows:

$$ f(\text{NaN}) = f(\pm\infty) = f(\pm 0.0) = 1, $$

and, if $x$ is finite and nonzero,

$$ f(x) = \max(|\lfloor \log_2 x\rfloor|, p), $$

where $p$ is the precision of $x$.

Informally, the complexity is proportional to the number of characters you would need to write the Float out without using exponents.

See also the Float implementation of SignificantBits.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::basic::traits::{NaN, One};
use malachite_float::Float;

assert_eq!(Float::NAN.complexity(), 1);
assert_eq!(Float::ONE.complexity(), 1);
assert_eq!(Float::one_prec(100).complexity(), 100);
assert_eq!(Float::from(std::f64::consts::PI).complexity(), 50);
assert_eq!(Float::power_of_2(100u64).complexity(), 100);
assert_eq!(Float::power_of_2(-100i64).complexity(), 100);
Source

pub const MIN_POSITIVE: Float

Source

pub fn to_significand(&self) -> Option<Natural>

Gets the significand of a Float, taking the Float by value.

The significand is the smallest positive integer which is some power of 2 times the Float, and whose number of significant bits is a multiple of the limb width. If the Float is NaN, infinite, or zero, then None is returned.

§Worst-case complexity

Constant time and additional memory.

§Examples
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_base::num::arithmetic::traits::PowerOf2;
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_base::num::basic::traits::One;
use malachite_base::num::basic::traits::{Infinity, NaN, Zero};
use malachite_float::Float;
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_nz::natural::Natural;

assert_eq!(Float::NAN.to_significand(), None);
assert_eq!(Float::INFINITY.to_significand(), None);
assert_eq!(Float::ZERO.to_significand(), None);

#[cfg(not(feature = "32_bit_limbs"))]
{
    assert_eq!(Float::ONE.to_significand(), Some(Natural::power_of_2(63)));
    assert_eq!(
        Float::from(std::f64::consts::PI).to_significand().unwrap(),
        14488038916154245120u64
    );
}
Source

pub fn significand_ref(&self) -> Option<&Natural>

Returns a reference to the significand of a Float.

The significand is the smallest positive integer which is some power of 2 times the Float, and whose number of significant bits is a multiple of the limb width. If the Float is NaN, infinite, or zero, then None is returned.

§Worst-case complexity

Constant time and additional memory.

§Examples
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_base::num::arithmetic::traits::PowerOf2;
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_base::num::basic::traits::One;
use malachite_base::num::basic::traits::{Infinity, NaN, Zero};
use malachite_float::Float;
#[cfg(not(feature = "32_bit_limbs"))]
use malachite_nz::natural::Natural;

assert_eq!(Float::NAN.significand_ref(), None);
assert_eq!(Float::INFINITY.significand_ref(), None);
assert_eq!(Float::ZERO.significand_ref(), None);

#[cfg(not(feature = "32_bit_limbs"))]
{
    assert_eq!(
        *Float::ONE.significand_ref().unwrap(),
        Natural::power_of_2(63)
    );
    assert_eq!(
        *Float::from(std::f64::consts::PI).significand_ref().unwrap(),
        14488038916154245120u64
    );
}
Source

pub fn get_exponent(&self) -> Option<i32>

Returns a Float’s exponent.

$$ f(\text{NaN}) = f(\pm\infty) = f(\pm 0.0) = \text{None}, $$

and, if $x$ is finite and nonzero,

$$ f(x) = \operatorname{Some}(\lfloor \log_2 x \rfloor + 1). $$

The output is in the range $[-(2^{30}-1), 2^{30}-1]$.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::basic::traits::{Infinity, NaN, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.get_exponent(), None);
assert_eq!(Float::INFINITY.get_exponent(), None);
assert_eq!(Float::ZERO.get_exponent(), None);

assert_eq!(Float::ONE.get_exponent(), Some(1));
assert_eq!(Float::from(std::f64::consts::PI).get_exponent(), Some(2));
assert_eq!(Float::power_of_2(100u64).get_exponent(), Some(101));
assert_eq!(Float::power_of_2(-100i64).get_exponent(), Some(-99));
Source

pub fn get_prec(&self) -> Option<u64>

Returns a Float’s precision. The precision is a positive integer denoting how many of the Float’s bits are significant.

Only Floats that are finite and nonzero have a precision. For other Floats, None is returned.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.get_prec(), None);
assert_eq!(Float::INFINITY.get_prec(), None);
assert_eq!(Float::ZERO.get_prec(), None);

assert_eq!(Float::ONE.get_prec(), Some(1));
assert_eq!(Float::one_prec(100).get_prec(), Some(100));
assert_eq!(Float::from(std::f64::consts::PI).get_prec(), Some(50));
Source

pub fn get_min_prec(&self) -> Option<u64>

Returns the minimum precision necessary to represent the given Float’s value.

For example, Float:one_prec(100) has a precision of 100, but its minimum precision is 1, because that’s all that’s necessary to represent the value 1.

The minimum precision is always less than or equal to the actual precision.

Only Floats that are finite and nonzero have a minimum precision. For other Floats, None is returned.

§Worst-case complexity

Constant time and additional memory.

§Examples
use malachite_base::num::basic::traits::{Infinity, NaN, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.get_min_prec(), None);
assert_eq!(Float::INFINITY.get_min_prec(), None);
assert_eq!(Float::ZERO.get_min_prec(), None);

assert_eq!(Float::ONE.get_min_prec(), Some(1));
assert_eq!(Float::one_prec(100).get_min_prec(), Some(1));
assert_eq!(Float::from(std::f64::consts::PI).get_min_prec(), Some(50));
Source

pub fn ulp(&self) -> Option<Float>

Gets a Float’s ulp (unit in last place, or unit of least precision).

If the Float is positive, its ulp is the distance to the next-largest Float with the same precision; if it is negative, the next-smallest. (This definition works even if the Float is the largest in its binade. If the Float is the largest in its binade and has the maximum exponent, we can define its ulp to be the distance to the next-smallest Float with the same precision if positive, and to the next-largest Float with the same precision if negative.)

If the Float is NaN, infinite, or zero, then None is returned.

This function does not overflow or underflow, technically. But it is possible that a Float’s ulp is too small to represent, for example if the Float has the minimum exponent and its precision is greater than 1, or if the precision is extremely large in general. In such cases, None is returned.

$$ f(\text{NaN}) = f(\pm\infty) = f(\pm 0.0) = \text{None}, $$

and, if $x$ is finite and nonzero,

$$ f(x) = \operatorname{Some}(2^{\lfloor \log_2 x \rfloor-p+1}), $$ where $p$ is the precision of $x$.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(n)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Examples
use malachite_base::num::arithmetic::traits::PowerOf2;
use malachite_base::num::basic::traits::{Infinity, NaN, NegativeOne, One, Zero};
use malachite_float::Float;

assert_eq!(Float::NAN.ulp(), None);
assert_eq!(Float::INFINITY.ulp(), None);
assert_eq!(Float::ZERO.ulp(), None);

let s = Float::ONE.ulp().map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("1.0"));

let s = Float::one_prec(100).ulp().map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("2.0e-30"));

let s = Float::from(std::f64::consts::PI)
    .ulp()
    .map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("4.0e-15"));

let s = Float::power_of_2(100u64).ulp().map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("1.0e30"));

let s = Float::power_of_2(-100i64).ulp().map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("8.0e-31"));

let s = Float::NEGATIVE_ONE.ulp().map(|x| x.to_string());
assert_eq!(s.as_ref().map(|s| s.as_str()), Some("1.0"));
Source

pub fn sci_mantissa_and_exponent_round<T: PrimitiveFloat>( &self, rm: RoundingMode, ) -> Option<(T, i32, Ordering)>

Returns a Float’s scientific mantissa and exponent, rounding according to the specified rounding mode. An Ordering is also returned, indicating whether the mantissa and exponent represent a value that is less than, equal to, or greater than the original value.

When $x$ is positive, we can write $x = 2^{e_s}m_s$, where $e_s$ is an integer and $m_s$ is a rational number with $1 \leq m_s < 2$. We represent the rational mantissa as a float. The conversion might not be exact, so we round to the nearest float using the provided rounding mode. If the rounding mode is Exact but the conversion is not exact, None is returned. $$ f(x, r) \approx \left (\frac{x}{2^{\lfloor \log_2 x \rfloor}}, \lfloor \log_2 x \rfloor\right ). $$

This function does not overflow or underflow. The returned exponent is always in the range $[-2^{30}, 2^{30}-1]$. Notice that although a Float’s maximum scientific exponent is $2^{30}-2$, this function may return an exponent one larger than this limit due to rounding.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(1)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

§Examples
use malachite_base::num::arithmetic::traits::Pow;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_base::num::float::NiceFloat;
use malachite_base::rounding_modes::RoundingMode::{self, *};
use malachite_float::Float;
use malachite_nz::natural::Natural;
use std::cmp::Ordering::{self, *};

let test = |x: Float, rm: RoundingMode, out: Option<(f32, i32, Ordering)>| {
    assert_eq!(
        x.sci_mantissa_and_exponent_round(rm)
            .map(|(m, e, o)| (NiceFloat(m), e, o)),
        out.map(|(m, e, o)| (NiceFloat(m), e, o))
    );
};
test(Float::from(3u32), Floor, Some((1.5, 1, Equal)));
test(Float::from(3u32), Down, Some((1.5, 1, Equal)));
test(Float::from(3u32), Ceiling, Some((1.5, 1, Equal)));
test(Float::from(3u32), Up, Some((1.5, 1, Equal)));
test(Float::from(3u32), Nearest, Some((1.5, 1, Equal)));
test(Float::from(3u32), Exact, Some((1.5, 1, Equal)));

let x = Float::from(std::f64::consts::PI);
test(x.clone(), Floor, Some((1.5707963, 1, Less)));
test(x.clone(), Down, Some((1.5707963, 1, Less)));
test(x.clone(), Ceiling, Some((1.5707964, 1, Greater)));
test(x.clone(), Up, Some((1.5707964, 1, Greater)));
test(x.clone(), Nearest, Some((1.5707964, 1, Greater)));
test(x.clone(), Exact, None);

test(
    Float::from(1000000000u32),
    Nearest,
    Some((1.8626451, 29, Equal)),
);
test(
    Float::exact_from(Natural::from(10u32).pow(52)),
    Nearest,
    Some((1.670478, 172, Greater)),
);

test(Float::exact_from(Natural::from(10u32).pow(52)), Exact, None);
Source

pub const MAX_EXPONENT: i32 = 1_073_741_823i32

Source

pub const MIN_EXPONENT: i32 = -1_073_741_823i32

Trait Implementations§

Source§

impl<'a> Clone for ComparableFloatRef<'a>

Source§

fn clone(&self) -> ComparableFloatRef<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ComparableFloatRef<'_>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for ComparableFloatRef<'_>

Source§

fn deref(&self) -> &Float

Allows a ComparableFloatRef to dereference to a Float.

use malachite_base::num::basic::traits::One;
use malachite_float::{ComparableFloatRef, Float};

let x = Float::ONE;
let y = ComparableFloatRef(&x);
assert_eq!(*y, Float::ONE);
Source§

type Target = Float

The resulting type after dereferencing.
Source§

impl Display for ComparableFloatRef<'_>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ComparableFloatRef<'_>

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Computes a hash of a ComparableFloatRef.

The hash is compatible with ComparableFloatRef equality: all NaNs hash to the same value.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(1)$

where $T$ is time, $M$ is additional memory, and $n$ is self.significant_bits().

1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl LowerHex for ComparableFloatRef<'_>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> Ord for ComparableFloatRef<'a>

Source§

fn cmp(&self, other: &ComparableFloatRef<'a>) -> Ordering

Compares two ComparableFloatRefs.

This implementation does not follow the IEEE 754 standard. This is how ComparableFloatRefs are ordered, least to greatest:

  • $-\infty$
  • Negative nonzero finite floats
  • Negative zero
  • NaN
  • Positive zero
  • Positive nonzero finite floats
  • $\infty$

For different comparison behavior that follows the IEEE 754 standard, consider just using Float.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(1)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, OneHalf, Zero,
};
use malachite_float::{ComparableFloatRef, Float};
use std::cmp::Ordering::*;

assert_eq!(
    ComparableFloatRef(&Float::NAN).partial_cmp(&ComparableFloatRef(&Float::NAN)),
    Some(Equal)
);
assert!(ComparableFloatRef(&Float::ZERO) > ComparableFloatRef(&Float::NEGATIVE_ZERO));
assert!(ComparableFloatRef(&Float::ONE) < ComparableFloatRef(&Float::one_prec(100)));
assert!(ComparableFloatRef(&Float::INFINITY) > ComparableFloatRef(&Float::ONE));
assert!(ComparableFloatRef(&Float::NEGATIVE_INFINITY) < ComparableFloatRef(&Float::ONE));
assert!(ComparableFloatRef(&Float::ONE_HALF) < ComparableFloatRef(&Float::ONE));
assert!(ComparableFloatRef(&Float::ONE_HALF) > ComparableFloatRef(&Float::NEGATIVE_ONE));
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl<'a> OrdAbs for ComparableFloatRef<'a>

Source§

fn cmp_abs(&self, other: &ComparableFloatRef<'a>) -> Ordering

Compares the absolute values of two ComparableFloatRefs.

This implementation does not follow the IEEE 754 standard. This is how ComparableFloatRefs are ordered by absolute value, from least to greatest:

  • NaN
  • Positive and negative zero
  • Nonzero finite floats
  • $\infty$ and $-\infty$

For different comparison behavior that follows the IEEE 754 standard, consider just using Float.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(1)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Examples
use malachite_base::num::basic::traits::{
    Infinity, NaN, NegativeInfinity, NegativeOne, NegativeZero, One, OneHalf, Zero,
};
use malachite_base::num::comparison::traits::PartialOrdAbs;
use malachite_float::{ComparableFloatRef, Float};
use std::cmp::Ordering::*;

assert_eq!(
    ComparableFloatRef(&Float::NAN).partial_cmp_abs(&ComparableFloatRef(&Float::NAN)),
    Some(Equal)
);
assert_eq!(
    ComparableFloatRef(&Float::ZERO)
        .partial_cmp_abs(&ComparableFloatRef(&Float::NEGATIVE_ZERO)),
    Some(Equal)
);
assert!(ComparableFloatRef(&Float::ONE).lt_abs(&ComparableFloatRef(&Float::one_prec(100))));
assert!(ComparableFloatRef(&Float::INFINITY).gt_abs(&ComparableFloatRef(&Float::ONE)));
assert!(
    ComparableFloatRef(&Float::NEGATIVE_INFINITY).gt_abs(&ComparableFloatRef(&Float::ONE))
);
assert!(ComparableFloatRef(&Float::ONE_HALF).lt_abs(&ComparableFloatRef(&Float::ONE)));
assert!(
    ComparableFloatRef(&Float::ONE_HALF).lt_abs(&ComparableFloatRef(&Float::NEGATIVE_ONE))
);
Source§

impl<'a> PartialEq<ComparableFloatRef<'a>> for ComparableFloatRef<'_>

Source§

fn eq(&self, other: &ComparableFloatRef<'a>) -> bool

Compares two ComparableFloatRefs for equality.

This implementation ignores the IEEE 754 standard in favor of an equality operation that respects the expected properties of symmetry, reflexivity, and transitivity. Using ComparableFloatRef, NaNs are equal to themselves. There is a single, unique NaN; there’s no concept of signalling NaNs. Positive and negative zero are two distinct values, not equal to each other. ComparableFloatRefs with different precisions are unequal.

§Worst-case complexity

$T(n) = O(n)$

$M(n) = O(1)$

where $T$ is time, $M$ is additional memory, and $n$ is max(self.significant_bits(), other.significant_bits()).

§Examples
use malachite_base::num::basic::traits::{NaN, NegativeZero, One, Two, Zero};
use malachite_float::{ComparableFloatRef, Float};

assert_eq!(
    ComparableFloatRef(&Float::NAN),
    ComparableFloatRef(&Float::NAN)
);
assert_eq!(
    ComparableFloatRef(&Float::ZERO),
    ComparableFloatRef(&Float::ZERO)
);
assert_eq!(
    ComparableFloatRef(&Float::NEGATIVE_ZERO),
    ComparableFloatRef(&Float::NEGATIVE_ZERO)
);
assert_ne!(
    ComparableFloatRef(&Float::ZERO),
    ComparableFloatRef(&Float::NEGATIVE_ZERO)
);

assert_eq!(
    ComparableFloatRef(&Float::ONE),
    ComparableFloatRef(&Float::ONE)
);
assert_ne!(
    ComparableFloatRef(&Float::ONE),
    ComparableFloatRef(&Float::TWO)
);
assert_ne!(
    ComparableFloatRef(&Float::ONE),
    ComparableFloatRef(&Float::one_prec(100))
);
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for ComparableFloatRef<'_>

Source§

fn partial_cmp(&self, other: &ComparableFloatRef<'_>) -> Option<Ordering>

Compares two ComparableFloatRefs.

See the documentation for the Ord implementation.

1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl PartialOrdAbs for ComparableFloatRef<'_>

Source§

fn partial_cmp_abs(&self, other: &ComparableFloatRef<'_>) -> Option<Ordering>

Compares the absolute values of two ComparableFloatRefs.

See the documentation for the Ord implementation.

Source§

fn lt_abs(&self, other: &Rhs) -> bool

Determines whether the absolute value of one number is less than the absolute value of another. Read more
Source§

fn le_abs(&self, other: &Rhs) -> bool

Determines whether the absolute value of one number is less than or equal to the absolute value of another. Read more
Source§

fn gt_abs(&self, other: &Rhs) -> bool

Determines whether the absolute value of one number is greater than the absolute value of another. Read more
Source§

fn ge_abs(&self, other: &Rhs) -> bool

Determines whether the absolute value of one number is greater than or equal to the absolute value of another. Read more
Source§

impl Eq for ComparableFloatRef<'_>

Auto Trait Implementations§

§

impl<'a> Freeze for ComparableFloatRef<'a>

§

impl<'a> RefUnwindSafe for ComparableFloatRef<'a>

§

impl<'a> Send for ComparableFloatRef<'a>

§

impl<'a> Sync for ComparableFloatRef<'a>

§

impl<'a> Unpin for ComparableFloatRef<'a>

§

impl<'a> UnwindSafe for ComparableFloatRef<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T, U> ExactFrom<T> for U
where U: TryFrom<T>,

Source§

fn exact_from(value: T) -> U

Source§

impl<T, U> ExactInto<U> for T
where U: ExactFrom<T>,

Source§

fn exact_into(self) -> U

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> OverflowingInto<U> for T
where U: OverflowingFrom<T>,

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> RoundingInto<U> for T
where U: RoundingFrom<T>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> SaturatingInto<U> for T
where U: SaturatingFrom<T>,

Source§

impl<T> ToDebugString for T
where T: Debug,

Source§

fn to_debug_string(&self) -> String

Returns the String produced by Ts Debug implementation.

§Examples
use malachite_base::strings::ToDebugString;

assert_eq!([1, 2, 3].to_debug_string(), "[1, 2, 3]");
assert_eq!(
    [vec![2, 3], vec![], vec![4]].to_debug_string(),
    "[[2, 3], [], [4]]"
);
assert_eq!(Some(5).to_debug_string(), "Some(5)");
Source§

impl<T> ToLowerHexString for T
where T: LowerHex,

Source§

fn to_lower_hex_string(&self) -> String

Returns the String produced by Ts LowerHex implementation.

§Examples
use malachite_base::strings::ToLowerHexString;

assert_eq!(50u64.to_lower_hex_string(), "32");
assert_eq!((-100i16).to_lower_hex_string(), "ff9c");
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T, U> WrappingInto<U> for T
where U: WrappingFrom<T>,

Source§

fn wrapping_into(self) -> U