(index<- )        ./libcore/num/f64.rs

    git branch:    * master           5200215 auto merge of #14035 : alexcrichton/rust/experimental, r=huonw
    modified:    Fri May  9 13:02:28 2014
   1  // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
   2  // file at the top-level directory of this distribution and at
   3  // http://rust-lang.org/COPYRIGHT.
   4  //
   5  // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
   6  // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
   7  // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
   8  // option. This file may not be copied, modified, or distributed
   9  // except according to those terms.
  10  
  11  //! Operations and constants for 64-bits floats (`f64` type)
  12  
  13  use default::Default;
  14  use intrinsics;
  15  use num::{Zero, One, Bounded, Signed, Num, Primitive};
  16  
  17  #[cfg(not(test))] use cmp::{Eq, Ord};
  18  #[cfg(not(test))] use ops::{Add, Sub, Mul, Div, Rem, Neg};
  19  
  20  // FIXME(#5527): These constants should be deprecated once associated
  21  // constants are implemented in favour of referencing the respective
  22  // members of `Bounded` and `Float`.
  23  
  24  pub static RADIX: uint = 2u;
  25  
  26  pub static MANTISSA_DIGITS: uint = 53u;
  27  pub static DIGITS: uint = 15u;
  28  
  29  pub static EPSILON: f64 = 2.2204460492503131e-16_f64;
  30  
  31  /// Smallest finite f64 value
  32  pub static MIN_VALUE: f64 = -1.7976931348623157e+308_f64;
  33  /// Smallest positive, normalized f64 value
  34  pub static MIN_POS_VALUE: f64 = 2.2250738585072014e-308_f64;
  35  /// Largest finite f64 value
  36  pub static MAX_VALUE: f64 = 1.7976931348623157e+308_f64;
  37  
  38  pub static MIN_EXP: int = -1021;
  39  pub static MAX_EXP: int = 1024;
  40  
  41  pub static MIN_10_EXP: int = -307;
  42  pub static MAX_10_EXP: int = 308;
  43  
  44  pub static NAN: f64 = 0.0_f64/0.0_f64;
  45  
  46  pub static INFINITY: f64 = 1.0_f64/0.0_f64;
  47  
  48  pub static NEG_INFINITY: f64 = -1.0_f64/0.0_f64;
  49  
  50  /// Various useful constants.
  51  pub mod consts {
  52      // FIXME: replace with mathematical constants from cmath.
  53  
  54      // FIXME(#5527): These constants should be deprecated once associated
  55      // constants are implemented in favour of referencing the respective members
  56      // of `Float`.
  57  
  58      /// Archimedes' constant
  59      pub static PI: f64 = 3.14159265358979323846264338327950288_f64;
  60  
  61      /// pi * 2.0
  62      pub static PI_2: f64 = 6.28318530717958647692528676655900576_f64;
  63  
  64      /// pi/2.0
  65      pub static FRAC_PI_2: f64 = 1.57079632679489661923132169163975144_f64;
  66  
  67      /// pi/3.0
  68      pub static FRAC_PI_3: f64 = 1.04719755119659774615421446109316763_f64;
  69  
  70      /// pi/4.0
  71      pub static FRAC_PI_4: f64 = 0.785398163397448309615660845819875721_f64;
  72  
  73      /// pi/6.0
  74      pub static FRAC_PI_6: f64 = 0.52359877559829887307710723054658381_f64;
  75  
  76      /// pi/8.0
  77      pub static FRAC_PI_8: f64 = 0.39269908169872415480783042290993786_f64;
  78  
  79      /// 1.0/pi
  80      pub static FRAC_1_PI: f64 = 0.318309886183790671537767526745028724_f64;
  81  
  82      /// 2.0/pi
  83      pub static FRAC_2_PI: f64 = 0.636619772367581343075535053490057448_f64;
  84  
  85      /// 2.0/sqrt(pi)
  86      pub static FRAC_2_SQRTPI: f64 = 1.12837916709551257389615890312154517_f64;
  87  
  88      /// sqrt(2.0)
  89      pub static SQRT2: f64 = 1.41421356237309504880168872420969808_f64;
  90  
  91      /// 1.0/sqrt(2.0)
  92      pub static FRAC_1_SQRT2: f64 = 0.707106781186547524400844362104849039_f64;
  93  
  94      /// Euler's number
  95      pub static E: f64 = 2.71828182845904523536028747135266250_f64;
  96  
  97      /// log2(e)
  98      pub static LOG2_E: f64 = 1.44269504088896340735992468100189214_f64;
  99  
 100      /// log10(e)
 101      pub static LOG10_E: f64 = 0.434294481903251827651128918916605082_f64;
 102  
 103      /// ln(2.0)
 104      pub static LN_2: f64 = 0.693147180559945309417232121458176568_f64;
 105  
 106      /// ln(10.0)
 107      pub static LN_10: f64 = 2.30258509299404568401799145468436421_f64;
 108  }
 109  
 110  #[cfg(not(test))]
 111  impl Ord for f64 {
 112      #[inline]
 113      fn lt(&self, other&f64) -> bool { (*self) < (*other) }
 114      #[inline]
 115      fn le(&self, other&f64) -> bool { (*self) <= (*other) }
 116      #[inline]
 117      fn ge(&self, other&f64) -> bool { (*self) >= (*other) }
 118      #[inline]
 119      fn gt(&self, other&f64) -> bool { (*self) > (*other) }
 120  }
 121  #[cfg(not(test))]
 122  impl Eq for f64 {
 123      #[inline]
 124      fn eq(&self, other&f64) -> bool { (*self) == (*other) }
 125  }
 126  
 127  impl Default for f64 {
 128      #[inline]
 129      fn default() -> f64 { 0.0 }
 130  }
 131  
 132  impl Primitive for f64 {}
 133  
 134  impl Num for f64 {}
 135  
 136  impl Zero for f64 {
 137      #[inline]
 138      fn zero() -> f64 { 0.0 }
 139  
 140      /// Returns true if the number is equal to either `0.0` or `-0.0`
 141      #[inline]
 142      fn is_zero(&self) -> bool { *self == 0.0 || *self == -0.0 }
 143  }
 144  
 145  impl One for f64 {
 146      #[inline]
 147      fn one() -> f64 { 1.0 }
 148  }
 149  
 150  #[cfg(not(test))]
 151  impl Add<f64,f64> for f64 {
 152      #[inline]
 153      fn add(&self, other&f64) -> f64 { *self + *other }
 154  }
 155  #[cfg(not(test))]
 156  impl Sub<f64,f64> for f64 {
 157      #[inline]
 158      fn sub(&self, other&f64) -> f64 { *self - *other }
 159  }
 160  #[cfg(not(test))]
 161  impl Mul<f64,f64> for f64 {
 162      #[inline]
 163      fn mul(&self, other&f64) -> f64 { *self * *other }
 164  }
 165  #[cfg(not(test))]
 166  impl Div<f64,f64> for f64 {
 167      #[inline]
 168      fn div(&self, other&f64) -> f64 { *self / *other }
 169  }
 170  #[cfg(not(test))]
 171  impl Rem<f64,f64> for f64 {
 172      #[inline]
 173      fn rem(&self, other&f64) -> f64 {
 174          extern { fn fmod(a: f64, b: f64) -> f64; }
 175          unsafe { fmod(*self, *other) }
 176      }
 177  }
 178  #[cfg(not(test))]
 179  impl Neg<f64> for f64 {
 180      #[inline]
 181      fn neg(&self) -> f64 { -*self }
 182  }
 183  
 184  impl Signed for f64 {
 185      /// Computes the absolute value. Returns `NAN` if the number is `NAN`.
 186      #[inline]
 187      fn abs(&self) -> f64 {
 188          unsafe { intrinsics::fabsf64(*self) }
 189      }
 190  
 191      /// The positive difference of two numbers. Returns `0.0` if the number is less than or
 192      /// equal to `other`, otherwise the difference between`self` and `other` is returned.
 193      #[inline]
 194      fn abs_sub(&self, other&f64) -> f64 {
 195          extern { fn fdim(af64, bf64) -> f64; }
 196          unsafe { fdim(*self, *other) }
 197      }
 198  
 199      /// # Returns
 200      ///
 201      /// - `1.0` if the number is positive, `+0.0` or `INFINITY`
 202      /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
 203      /// - `NAN` if the number is NaN
 204      #[inline]
 205      fn signum(&self) -> f64 {
 206          if self != self { NAN } else {
 207              unsafe { intrinsics::copysignf64(1.0, *self) }
 208          }
 209      }
 210  
 211      /// Returns `true` if the number is positive, including `+0.0` and `INFINITY`
 212      #[inline]
 213      fn is_positive(&self) -> bool { *self > 0.0 || (1.0 / *self) == INFINITY }
 214  
 215      /// Returns `true` if the number is negative, including `-0.0` and `NEG_INFINITY`
 216      #[inline]
 217      fn is_negative(&self) -> bool { *self < 0.0 || (1.0 / *self) == NEG_INFINITY }
 218  }
 219  
 220  impl Bounded for f64 {
 221      // NOTE: this is the smallest non-infinite f32 value, *not* MIN_VALUE
 222      #[inline]
 223      fn min_value() -> f64 { -MAX_VALUE }
 224  
 225      #[inline]
 226      fn max_value() -> f64 { MAX_VALUE }
 227  }