forked from RustPython/RustPython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfloat_tests.rs
More file actions
109 lines (97 loc) · 3.65 KB
/
float_tests.rs
File metadata and controls
109 lines (97 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
macro_rules! assert_approx_eq {
($left:expr, $right:expr) => {
match ($left, $right) {
(Ok(lhs), Ok(rhs)) => approx::assert_relative_eq!(lhs, rhs),
(lhs, rhs) => assert_eq!(lhs, rhs),
}
};
}
macro_rules! assert_bits_eq {
($left:expr, $right:expr) => {
match ($left, $right) {
(Ok(lhs), Ok(rhs)) => assert!(lhs.to_bits() == rhs.to_bits()),
(lhs, rhs) => assert_eq!(lhs, rhs),
}
};
}
#[test]
fn test_add() {
let add = jit_function! { add(a:f64, b:f64) -> f64 => r##"
def add(a: float, b: float):
return a + b
"## };
assert_approx_eq!(add(5.5, 10.2), Ok(15.7));
assert_approx_eq!(add(-4.5, 7.6), Ok(3.1));
assert_approx_eq!(add(-5.2, -3.9), Ok(-9.1));
assert_bits_eq!(add(-5.2, f64::NAN), Ok(f64::NAN));
assert_eq!(add(2.0, f64::INFINITY), Ok(f64::INFINITY));
assert_eq!(add(-2.0, f64::NEG_INFINITY), Ok(f64::NEG_INFINITY));
assert_eq!(add(1.0, f64::NEG_INFINITY), Ok(f64::NEG_INFINITY));
}
#[test]
fn test_sub() {
let sub = jit_function! { sub(a:f64, b:f64) -> f64 => r##"
def sub(a: float, b: float):
return a - b
"## };
assert_approx_eq!(sub(5.2, 3.6), Ok(1.6));
assert_approx_eq!(sub(3.4, 4.2), Ok(-0.8));
assert_approx_eq!(sub(-2.1, 1.3), Ok(-3.4));
assert_approx_eq!(sub(3.1, -1.3), Ok(4.4));
assert_bits_eq!(sub(-5.2, f64::NAN), Ok(f64::NAN));
assert_eq!(sub(f64::INFINITY, 2.0), Ok(f64::INFINITY));
assert_eq!(sub(-2.0, f64::NEG_INFINITY), Ok(f64::INFINITY));
assert_eq!(sub(1.0, f64::INFINITY), Ok(f64::NEG_INFINITY));
}
#[test]
fn test_mul() {
let mul = jit_function! { mul(a:f64, b:f64) -> f64 => r##"
def mul(a: float, b: float):
return a * b
"## };
assert_approx_eq!(mul(5.2, 2.0), Ok(10.4));
assert_approx_eq!(mul(3.4, -1.7), Ok(-5.779999999999999));
assert_bits_eq!(mul(1.0, 0.0), Ok(0.0f64));
assert_bits_eq!(mul(1.0, -0.0), Ok(-0.0f64));
assert_bits_eq!(mul(-1.0, 0.0), Ok(-0.0f64));
assert_bits_eq!(mul(-1.0, -0.0), Ok(0.0f64));
assert_bits_eq!(mul(-5.2, f64::NAN), Ok(f64::NAN));
assert_eq!(mul(1.0, f64::INFINITY), Ok(f64::INFINITY));
assert_eq!(mul(1.0, f64::NEG_INFINITY), Ok(f64::NEG_INFINITY));
assert_eq!(mul(-1.0, f64::INFINITY), Ok(f64::NEG_INFINITY));
assert!(mul(0.0, f64::INFINITY).unwrap().is_nan());
assert_eq!(mul(f64::NEG_INFINITY, f64::INFINITY), Ok(f64::NEG_INFINITY));
}
#[test]
fn test_div() {
let div = jit_function! { div(a:f64, b:f64) -> f64 => r##"
def div(a: float, b: float):
return a / b
"## };
assert_approx_eq!(div(5.2, 2.0), Ok(2.6));
assert_approx_eq!(div(3.4, -1.7), Ok(-2.0));
assert_eq!(div(1.0, 0.0), Ok(f64::INFINITY));
assert_eq!(div(1.0, -0.0), Ok(f64::NEG_INFINITY));
assert_eq!(div(-1.0, 0.0), Ok(f64::NEG_INFINITY));
assert_eq!(div(-1.0, -0.0), Ok(f64::INFINITY));
assert_bits_eq!(div(-5.2, f64::NAN), Ok(f64::NAN));
assert_eq!(div(f64::INFINITY, 2.0), Ok(f64::INFINITY));
assert_bits_eq!(div(-2.0, f64::NEG_INFINITY), Ok(0.0f64));
assert_bits_eq!(div(1.0, f64::INFINITY), Ok(0.0f64));
assert_bits_eq!(div(2.0, f64::NEG_INFINITY), Ok(-0.0f64));
assert_bits_eq!(div(-1.0, f64::INFINITY), Ok(-0.0f64));
}
#[test]
fn test_if_bool() {
let if_bool = jit_function! { if_bool(a:f64) -> i64 => r##"
def if_bool(a: float):
if a:
return 1
return 0
"## };
assert_eq!(if_bool(5.2), Ok(1));
assert_eq!(if_bool(-3.4), Ok(1));
assert_eq!(if_bool(f64::NAN), Ok(1));
assert_eq!(if_bool(f64::INFINITY), Ok(1));
assert_eq!(if_bool(0.0), Ok(0));
}