]> git.lizzy.rs Git - rust.git/blob - src/libcore/num/f64.rs
auto merge of #14237 : alexcrichton/rust/issue-14144, r=cmr
[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 default::Default;
14 use intrinsics;
15 use mem;
16 use num::{FPNormal, FPCategory, FPZero, FPSubnormal, FPInfinite, FPNaN};
17 use num::{Zero, One, Bounded, Signed, Num, Primitive, Float};
18 use option::Option;
19
20 #[cfg(not(test))] use cmp::{Eq, Ord};
21 #[cfg(not(test))] use ops::{Add, Sub, Mul, Div, Rem, Neg};
22
23 // FIXME(#5527): These constants should be deprecated once associated
24 // constants are implemented in favour of referencing the respective
25 // members of `Bounded` and `Float`.
26
27 pub static RADIX: uint = 2u;
28
29 pub static MANTISSA_DIGITS: uint = 53u;
30 pub static DIGITS: uint = 15u;
31
32 pub static EPSILON: f64 = 2.2204460492503131e-16_f64;
33
34 /// Smallest finite f64 value
35 pub static MIN_VALUE: f64 = -1.7976931348623157e+308_f64;
36 /// Smallest positive, normalized f64 value
37 pub static MIN_POS_VALUE: f64 = 2.2250738585072014e-308_f64;
38 /// Largest finite f64 value
39 pub static MAX_VALUE: f64 = 1.7976931348623157e+308_f64;
40
41 pub static MIN_EXP: int = -1021;
42 pub static MAX_EXP: int = 1024;
43
44 pub static MIN_10_EXP: int = -307;
45 pub static MAX_10_EXP: int = 308;
46
47 pub static NAN: f64 = 0.0_f64/0.0_f64;
48
49 pub static INFINITY: f64 = 1.0_f64/0.0_f64;
50
51 pub static NEG_INFINITY: f64 = -1.0_f64/0.0_f64;
52
53 /// Various useful constants.
54 pub mod consts {
55     // FIXME: replace with mathematical constants from cmath.
56
57     // FIXME(#5527): These constants should be deprecated once associated
58     // constants are implemented in favour of referencing the respective members
59     // of `Float`.
60
61     /// Archimedes' constant
62     pub static PI: f64 = 3.14159265358979323846264338327950288_f64;
63
64     /// pi * 2.0
65     pub static PI_2: f64 = 6.28318530717958647692528676655900576_f64;
66
67     /// pi/2.0
68     pub static FRAC_PI_2: f64 = 1.57079632679489661923132169163975144_f64;
69
70     /// pi/3.0
71     pub static FRAC_PI_3: f64 = 1.04719755119659774615421446109316763_f64;
72
73     /// pi/4.0
74     pub static FRAC_PI_4: f64 = 0.785398163397448309615660845819875721_f64;
75
76     /// pi/6.0
77     pub static FRAC_PI_6: f64 = 0.52359877559829887307710723054658381_f64;
78
79     /// pi/8.0
80     pub static FRAC_PI_8: f64 = 0.39269908169872415480783042290993786_f64;
81
82     /// 1.0/pi
83     pub static FRAC_1_PI: f64 = 0.318309886183790671537767526745028724_f64;
84
85     /// 2.0/pi
86     pub static FRAC_2_PI: f64 = 0.636619772367581343075535053490057448_f64;
87
88     /// 2.0/sqrt(pi)
89     pub static FRAC_2_SQRTPI: f64 = 1.12837916709551257389615890312154517_f64;
90
91     /// sqrt(2.0)
92     pub static SQRT2: f64 = 1.41421356237309504880168872420969808_f64;
93
94     /// 1.0/sqrt(2.0)
95     pub static FRAC_1_SQRT2: f64 = 0.707106781186547524400844362104849039_f64;
96
97     /// Euler's number
98     pub static E: f64 = 2.71828182845904523536028747135266250_f64;
99
100     /// log2(e)
101     pub static LOG2_E: f64 = 1.44269504088896340735992468100189214_f64;
102
103     /// log10(e)
104     pub static LOG10_E: f64 = 0.434294481903251827651128918916605082_f64;
105
106     /// ln(2.0)
107     pub static LN_2: f64 = 0.693147180559945309417232121458176568_f64;
108
109     /// ln(10.0)
110     pub static LN_10: f64 = 2.30258509299404568401799145468436421_f64;
111 }
112
113 #[cfg(not(test))]
114 impl Ord for f64 {
115     #[inline]
116     fn lt(&self, other: &f64) -> bool { (*self) < (*other) }
117     #[inline]
118     fn le(&self, other: &f64) -> bool { (*self) <= (*other) }
119     #[inline]
120     fn ge(&self, other: &f64) -> bool { (*self) >= (*other) }
121     #[inline]
122     fn gt(&self, other: &f64) -> bool { (*self) > (*other) }
123 }
124 #[cfg(not(test))]
125 impl Eq for f64 {
126     #[inline]
127     fn eq(&self, other: &f64) -> bool { (*self) == (*other) }
128 }
129
130 impl Default for f64 {
131     #[inline]
132     fn default() -> f64 { 0.0 }
133 }
134
135 impl Primitive for f64 {}
136
137 impl Num for f64 {}
138
139 impl Zero for f64 {
140     #[inline]
141     fn zero() -> f64 { 0.0 }
142
143     /// Returns true if the number is equal to either `0.0` or `-0.0`
144     #[inline]
145     fn is_zero(&self) -> bool { *self == 0.0 || *self == -0.0 }
146 }
147
148 impl One for f64 {
149     #[inline]
150     fn one() -> f64 { 1.0 }
151 }
152
153 #[cfg(not(test))]
154 impl Add<f64,f64> for f64 {
155     #[inline]
156     fn add(&self, other: &f64) -> f64 { *self + *other }
157 }
158 #[cfg(not(test))]
159 impl Sub<f64,f64> for f64 {
160     #[inline]
161     fn sub(&self, other: &f64) -> f64 { *self - *other }
162 }
163 #[cfg(not(test))]
164 impl Mul<f64,f64> for f64 {
165     #[inline]
166     fn mul(&self, other: &f64) -> f64 { *self * *other }
167 }
168 #[cfg(not(test))]
169 impl Div<f64,f64> for f64 {
170     #[inline]
171     fn div(&self, other: &f64) -> f64 { *self / *other }
172 }
173 #[cfg(not(test))]
174 impl Rem<f64,f64> for f64 {
175     #[inline]
176     fn rem(&self, other: &f64) -> f64 {
177         extern { fn fmod(a: f64, b: f64) -> f64; }
178         unsafe { fmod(*self, *other) }
179     }
180 }
181 #[cfg(not(test))]
182 impl Neg<f64> for f64 {
183     #[inline]
184     fn neg(&self) -> f64 { -*self }
185 }
186
187 impl Signed for f64 {
188     /// Computes the absolute value. Returns `NAN` if the number is `NAN`.
189     #[inline]
190     fn abs(&self) -> f64 {
191         unsafe { intrinsics::fabsf64(*self) }
192     }
193
194     /// The positive difference of two numbers. Returns `0.0` if the number is less than or
195     /// equal to `other`, otherwise the difference between`self` and `other` is returned.
196     #[inline]
197     fn abs_sub(&self, other: &f64) -> f64 {
198         extern { fn fdim(a: f64, b: f64) -> f64; }
199         unsafe { fdim(*self, *other) }
200     }
201
202     /// # Returns
203     ///
204     /// - `1.0` if the number is positive, `+0.0` or `INFINITY`
205     /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
206     /// - `NAN` if the number is NaN
207     #[inline]
208     fn signum(&self) -> f64 {
209         if self != self { NAN } else {
210             unsafe { intrinsics::copysignf64(1.0, *self) }
211         }
212     }
213
214     /// Returns `true` if the number is positive, including `+0.0` and `INFINITY`
215     #[inline]
216     fn is_positive(&self) -> bool { *self > 0.0 || (1.0 / *self) == INFINITY }
217
218     /// Returns `true` if the number is negative, including `-0.0` and `NEG_INFINITY`
219     #[inline]
220     fn is_negative(&self) -> bool { *self < 0.0 || (1.0 / *self) == NEG_INFINITY }
221 }
222
223 impl Bounded for f64 {
224     // NOTE: this is the smallest non-infinite f32 value, *not* MIN_VALUE
225     #[inline]
226     fn min_value() -> f64 { -MAX_VALUE }
227
228     #[inline]
229     fn max_value() -> f64 { MAX_VALUE }
230 }
231
232 impl Float for f64 {
233     #[inline]
234     fn nan() -> f64 { NAN }
235
236     #[inline]
237     fn infinity() -> f64 { INFINITY }
238
239     #[inline]
240     fn neg_infinity() -> f64 { NEG_INFINITY }
241
242     #[inline]
243     fn neg_zero() -> f64 { -0.0 }
244
245     /// Returns `true` if the number is NaN
246     #[inline]
247     fn is_nan(self) -> bool { self != self }
248
249     /// Returns `true` if the number is infinite
250     #[inline]
251     fn is_infinite(self) -> bool {
252         self == Float::infinity() || self == Float::neg_infinity()
253     }
254
255     /// Returns `true` if the number is neither infinite or NaN
256     #[inline]
257     fn is_finite(self) -> bool {
258         !(self.is_nan() || self.is_infinite())
259     }
260
261     /// Returns `true` if the number is neither zero, infinite, subnormal or NaN
262     #[inline]
263     fn is_normal(self) -> bool {
264         self.classify() == FPNormal
265     }
266
267     /// Returns the floating point category of the number. If only one property
268     /// is going to be tested, it is generally faster to use the specific
269     /// predicate instead.
270     fn classify(self) -> FPCategory {
271         static EXP_MASK: u64 = 0x7ff0000000000000;
272         static MAN_MASK: u64 = 0x000fffffffffffff;
273
274         let bits: u64 = unsafe { mem::transmute(self) };
275         match (bits & MAN_MASK, bits & EXP_MASK) {
276             (0, 0)        => FPZero,
277             (_, 0)        => FPSubnormal,
278             (0, EXP_MASK) => FPInfinite,
279             (_, EXP_MASK) => FPNaN,
280             _             => FPNormal,
281         }
282     }
283
284     #[inline]
285     fn mantissa_digits(_: Option<f64>) -> uint { MANTISSA_DIGITS }
286
287     #[inline]
288     fn digits(_: Option<f64>) -> uint { DIGITS }
289
290     #[inline]
291     fn epsilon() -> f64 { EPSILON }
292
293     #[inline]
294     fn min_exp(_: Option<f64>) -> int { MIN_EXP }
295
296     #[inline]
297     fn max_exp(_: Option<f64>) -> int { MAX_EXP }
298
299     #[inline]
300     fn min_10_exp(_: Option<f64>) -> int { MIN_10_EXP }
301
302     #[inline]
303     fn max_10_exp(_: Option<f64>) -> int { MAX_10_EXP }
304
305     #[inline]
306     fn min_pos_value(_: Option<f64>) -> f64 { MIN_POS_VALUE }
307
308     /// Returns the mantissa, exponent and sign as integers.
309     fn integer_decode(self) -> (u64, i16, i8) {
310         let bits: u64 = unsafe { mem::transmute(self) };
311         let sign: i8 = if bits >> 63 == 0 { 1 } else { -1 };
312         let mut exponent: i16 = ((bits >> 52) & 0x7ff) as i16;
313         let mantissa = if exponent == 0 {
314             (bits & 0xfffffffffffff) << 1
315         } else {
316             (bits & 0xfffffffffffff) | 0x10000000000000
317         };
318         // Exponent bias + mantissa shift
319         exponent -= 1023 + 52;
320         (mantissa, exponent, sign)
321     }
322
323     /// Round half-way cases toward `NEG_INFINITY`
324     #[inline]
325     fn floor(self) -> f64 {
326         unsafe { intrinsics::floorf64(self) }
327     }
328
329     /// Round half-way cases toward `INFINITY`
330     #[inline]
331     fn ceil(self) -> f64 {
332         unsafe { intrinsics::ceilf64(self) }
333     }
334
335     /// Round half-way cases away from `0.0`
336     #[inline]
337     fn round(self) -> f64 {
338         unsafe { intrinsics::roundf64(self) }
339     }
340
341     /// The integer part of the number (rounds towards `0.0`)
342     #[inline]
343     fn trunc(self) -> f64 {
344         unsafe { intrinsics::truncf64(self) }
345     }
346
347     /// The fractional part of the number, satisfying:
348     ///
349     /// ```rust
350     /// let x = 1.65f64;
351     /// assert!(x == x.trunc() + x.fract())
352     /// ```
353     #[inline]
354     fn fract(self) -> f64 { self - self.trunc() }
355
356     /// Fused multiply-add. Computes `(self * a) + b` with only one rounding
357     /// error. This produces a more accurate result with better performance than
358     /// a separate multiplication operation followed by an add.
359     #[inline]
360     fn mul_add(self, a: f64, b: f64) -> f64 {
361         unsafe { intrinsics::fmaf64(self, a, b) }
362     }
363
364     /// The reciprocal (multiplicative inverse) of the number
365     #[inline]
366     fn recip(self) -> f64 { 1.0 / self }
367
368     #[inline]
369     fn powf(self, n: f64) -> f64 {
370         unsafe { intrinsics::powf64(self, n) }
371     }
372
373     #[inline]
374     fn powi(self, n: i32) -> f64 {
375         unsafe { intrinsics::powif64(self, n) }
376     }
377
378     /// sqrt(2.0)
379     #[inline]
380     fn sqrt2() -> f64 { consts::SQRT2 }
381
382     /// 1.0 / sqrt(2.0)
383     #[inline]
384     fn frac_1_sqrt2() -> f64 { consts::FRAC_1_SQRT2 }
385
386     #[inline]
387     fn sqrt(self) -> f64 {
388         unsafe { intrinsics::sqrtf64(self) }
389     }
390
391     #[inline]
392     fn rsqrt(self) -> f64 { self.sqrt().recip() }
393
394     /// Archimedes' constant
395     #[inline]
396     fn pi() -> f64 { consts::PI }
397
398     /// 2.0 * pi
399     #[inline]
400     fn two_pi() -> f64 { consts::PI_2 }
401
402     /// pi / 2.0
403     #[inline]
404     fn frac_pi_2() -> f64 { consts::FRAC_PI_2 }
405
406     /// pi / 3.0
407     #[inline]
408     fn frac_pi_3() -> f64 { consts::FRAC_PI_3 }
409
410     /// pi / 4.0
411     #[inline]
412     fn frac_pi_4() -> f64 { consts::FRAC_PI_4 }
413
414     /// pi / 6.0
415     #[inline]
416     fn frac_pi_6() -> f64 { consts::FRAC_PI_6 }
417
418     /// pi / 8.0
419     #[inline]
420     fn frac_pi_8() -> f64 { consts::FRAC_PI_8 }
421
422     /// 1.0 / pi
423     #[inline]
424     fn frac_1_pi() -> f64 { consts::FRAC_1_PI }
425
426     /// 2.0 / pi
427     #[inline]
428     fn frac_2_pi() -> f64 { consts::FRAC_2_PI }
429
430     /// 2.0 / sqrt(pi)
431     #[inline]
432     fn frac_2_sqrtpi() -> f64 { consts::FRAC_2_SQRTPI }
433
434     /// Euler's number
435     #[inline]
436     fn e() -> f64 { consts::E }
437
438     /// log2(e)
439     #[inline]
440     fn log2_e() -> f64 { consts::LOG2_E }
441
442     /// log10(e)
443     #[inline]
444     fn log10_e() -> f64 { consts::LOG10_E }
445
446     /// ln(2.0)
447     #[inline]
448     fn ln_2() -> f64 { consts::LN_2 }
449
450     /// ln(10.0)
451     #[inline]
452     fn ln_10() -> f64 { consts::LN_10 }
453
454     /// Returns the exponential of the number
455     #[inline]
456     fn exp(self) -> f64 {
457         unsafe { intrinsics::expf64(self) }
458     }
459
460     /// Returns 2 raised to the power of the number
461     #[inline]
462     fn exp2(self) -> f64 {
463         unsafe { intrinsics::exp2f64(self) }
464     }
465
466     /// Returns the natural logarithm of the number
467     #[inline]
468     fn ln(self) -> f64 {
469         unsafe { intrinsics::logf64(self) }
470     }
471
472     /// Returns the logarithm of the number with respect to an arbitrary base
473     #[inline]
474     fn log(self, base: f64) -> f64 { self.ln() / base.ln() }
475
476     /// Returns the base 2 logarithm of the number
477     #[inline]
478     fn log2(self) -> f64 {
479         unsafe { intrinsics::log2f64(self) }
480     }
481
482     /// Returns the base 10 logarithm of the number
483     #[inline]
484     fn log10(self) -> f64 {
485         unsafe { intrinsics::log10f64(self) }
486     }
487
488
489     /// Converts to degrees, assuming the number is in radians
490     #[inline]
491     fn to_degrees(self) -> f64 { self * (180.0f64 / Float::pi()) }
492
493     /// Converts to radians, assuming the number is in degrees
494     #[inline]
495     fn to_radians(self) -> f64 {
496         let value: f64 = Float::pi();
497         self * (value / 180.0)
498     }
499 }
500