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