]>
Commit | Line | Data |
---|---|---|
1a4d82fc | 1 | // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT |
223e47cc LB |
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 | ||
c34b1796 AL |
11 | |
12 | #![feature(intrinsics, core)] | |
1a4d82fc JJ |
13 | |
14 | macro_rules! assert_approx_eq { | |
15 | ($a:expr, $b:expr) => ({ | |
1a4d82fc JJ |
16 | let (a, b) = (&$a, &$b); |
17 | assert!((*a - *b).abs() < 1.0e-6, | |
18 | "{} is not approximately equal to {}", *a, *b); | |
19 | }) | |
20 | } | |
223e47cc LB |
21 | |
22 | mod rusti { | |
1a4d82fc JJ |
23 | extern "rust-intrinsic" { |
24 | pub fn sqrtf32(x: f32) -> f32; | |
25 | pub fn sqrtf64(x: f64) -> f64; | |
26 | pub fn powif32(a: f32, x: i32) -> f32; | |
27 | pub fn powif64(a: f64, x: i32) -> f64; | |
28 | pub fn sinf32(x: f32) -> f32; | |
29 | pub fn sinf64(x: f64) -> f64; | |
30 | pub fn cosf32(x: f32) -> f32; | |
31 | pub fn cosf64(x: f64) -> f64; | |
32 | pub fn powf32(a: f32, x: f32) -> f32; | |
33 | pub fn powf64(a: f64, x: f64) -> f64; | |
34 | pub fn expf32(x: f32) -> f32; | |
35 | pub fn expf64(x: f64) -> f64; | |
36 | pub fn exp2f32(x: f32) -> f32; | |
37 | pub fn exp2f64(x: f64) -> f64; | |
38 | pub fn logf32(x: f32) -> f32; | |
39 | pub fn logf64(x: f64) -> f64; | |
40 | pub fn log10f32(x: f32) -> f32; | |
41 | pub fn log10f64(x: f64) -> f64; | |
42 | pub fn log2f32(x: f32) -> f32; | |
43 | pub fn log2f64(x: f64) -> f64; | |
44 | pub fn fmaf32(a: f32, b: f32, c: f32) -> f32; | |
45 | pub fn fmaf64(a: f64, b: f64, c: f64) -> f64; | |
46 | pub fn fabsf32(x: f32) -> f32; | |
47 | pub fn fabsf64(x: f64) -> f64; | |
48 | pub fn floorf32(x: f32) -> f32; | |
49 | pub fn floorf64(x: f64) -> f64; | |
50 | pub fn ceilf32(x: f32) -> f32; | |
51 | pub fn ceilf64(x: f64) -> f64; | |
52 | pub fn truncf32(x: f32) -> f32; | |
53 | pub fn truncf64(x: f64) -> f64; | |
223e47cc LB |
54 | } |
55 | } | |
56 | ||
57 | pub fn main() { | |
58 | unsafe { | |
59 | use rusti::*; | |
60 | ||
970d7e83 LB |
61 | use std::f32; |
62 | use std::f64; | |
63 | ||
1a4d82fc JJ |
64 | assert_approx_eq!(sqrtf32(64f32), 8f32); |
65 | assert_approx_eq!(sqrtf64(64f64), 8f64); | |
223e47cc | 66 | |
c34b1796 AL |
67 | assert_approx_eq!(powif32(25f32, -2), 0.0016f32); |
68 | assert_approx_eq!(powif64(23.2f64, 2), 538.24f64); | |
223e47cc | 69 | |
1a4d82fc JJ |
70 | assert_approx_eq!(sinf32(0f32), 0f32); |
71 | assert_approx_eq!(sinf64(f64::consts::PI / 2f64), 1f64); | |
223e47cc | 72 | |
1a4d82fc JJ |
73 | assert_approx_eq!(cosf32(0f32), 1f32); |
74 | assert_approx_eq!(cosf64(f64::consts::PI * 2f64), 1f64); | |
223e47cc | 75 | |
1a4d82fc JJ |
76 | assert_approx_eq!(powf32(25f32, -2f32), 0.0016f32); |
77 | assert_approx_eq!(powf64(400f64, 0.5f64), 20f64); | |
223e47cc | 78 | |
1a4d82fc JJ |
79 | assert_approx_eq!(fabsf32(expf32(1f32) - f32::consts::E), 0f32); |
80 | assert_approx_eq!(expf64(1f64), f64::consts::E); | |
223e47cc | 81 | |
1a4d82fc JJ |
82 | assert_approx_eq!(exp2f32(10f32), 1024f32); |
83 | assert_approx_eq!(exp2f64(50f64), 1125899906842624f64); | |
223e47cc | 84 | |
1a4d82fc JJ |
85 | assert_approx_eq!(fabsf32(logf32(f32::consts::E) - 1f32), 0f32); |
86 | assert_approx_eq!(logf64(1f64), 0f64); | |
223e47cc | 87 | |
1a4d82fc JJ |
88 | assert_approx_eq!(log10f32(10f32), 1f32); |
89 | assert_approx_eq!(log10f64(f64::consts::E), f64::consts::LOG10_E); | |
223e47cc | 90 | |
1a4d82fc JJ |
91 | assert_approx_eq!(log2f32(8f32), 3f32); |
92 | assert_approx_eq!(log2f64(f64::consts::E), f64::consts::LOG2_E); | |
223e47cc | 93 | |
1a4d82fc JJ |
94 | assert_approx_eq!(fmaf32(1.0f32, 2.0f32, 5.0f32), 7.0f32); |
95 | assert_approx_eq!(fmaf64(0.0f64, -2.0f64, f64::consts::E), f64::consts::E); | |
223e47cc | 96 | |
1a4d82fc JJ |
97 | assert_approx_eq!(fabsf32(-1.0f32), 1.0f32); |
98 | assert_approx_eq!(fabsf64(34.2f64), 34.2f64); | |
970d7e83 | 99 | |
1a4d82fc JJ |
100 | assert_approx_eq!(floorf32(3.8f32), 3.0f32); |
101 | assert_approx_eq!(floorf64(-1.1f64), -2.0f64); | |
223e47cc LB |
102 | |
103 | // Causes linker error | |
104 | // undefined reference to llvm.ceil.f32/64 | |
105 | //assert!((ceilf32(-2.3f32) == -2.0f32)); | |
106 | //assert!((ceilf64(3.8f64) == 4.0f64)); | |
970d7e83 | 107 | |
223e47cc LB |
108 | // Causes linker error |
109 | // undefined reference to llvm.trunc.f32/64 | |
110 | //assert!((truncf32(0.1f32) == 0.0f32)); | |
111 | //assert!((truncf64(-0.1f64) == 0.0f64)); | |
112 | } | |
113 | ||
114 | } |