|
15 | 15 | extern crate test;
|
16 | 16 |
|
17 | 17 | use std::{f32, f64};
|
18 |
| -use std::{u8, i8, u16, i16, u32, i32, u64, i64, u128, i128}; |
| 18 | +use std::{u8, i8, u16, i16, u32, i32, u64, i64}; |
| 19 | +#[cfg(not(target_os="emscripten"))] |
| 20 | +use std::{u128, i128}; |
19 | 21 | use test::black_box;
|
20 | 22 |
|
21 | 23 | macro_rules! test {
|
@@ -92,8 +94,13 @@ macro_rules! fptoui_tests {
|
92 | 94 | }
|
93 | 95 |
|
94 | 96 | pub fn main() {
|
95 |
| - common_fptoi_tests!(f* -> i8 i16 i32 i64 i128 u8 u16 u32 u64 u128); |
96 |
| - fptoui_tests!(f* -> u8 u16 u32 u64 u128); |
| 97 | + common_fptoi_tests!(f* -> i8 i16 i32 i64 u8 u16 u32 u64); |
| 98 | + fptoui_tests!(f* -> u8 u16 u32 u64); |
| 99 | + // FIXME emscripten does not support i128 |
| 100 | + #[cfg(not(target_os="emscripten"))] { |
| 101 | + common_fptoi_tests!(f* -> i128 u128); |
| 102 | + fptoui_tests!(f* -> u128); |
| 103 | + } |
97 | 104 |
|
98 | 105 | // The following tests cover edge cases for some integer types.
|
99 | 106 |
|
@@ -125,30 +132,33 @@ pub fn main() {
|
125 | 132 | test!(4294967296., f* -> u32, 4294967295);
|
126 | 133 |
|
127 | 134 | // # u128
|
128 |
| - // float->int: |
129 |
| - test_c!(f32::MAX, f32 -> u128, 0xffffff00000000000000000000000000); |
130 |
| - // nextDown(f32::MAX) = 2^128 - 2 * 2^104 |
131 |
| - const SECOND_LARGEST_F32: f32 = 340282326356119256160033759537265639424.; |
132 |
| - test_c!(SECOND_LARGEST_F32, f32 -> u128, 0xfffffe00000000000000000000000000); |
133 |
| - |
134 |
| - // int->float: |
135 |
| - // f32::MAX - 0.5 ULP and smaller should be rounded down |
136 |
| - test_c!(0xfffffe00000000000000000000000000, u128 -> f32, SECOND_LARGEST_F32); |
137 |
| - test_c!(0xfffffe7fffffffffffffffffffffffff, u128 -> f32, SECOND_LARGEST_F32); |
138 |
| - test_c!(0xfffffe80000000000000000000000000, u128 -> f32, SECOND_LARGEST_F32); |
139 |
| - // numbers within < 0.5 ULP of f32::MAX it should be rounded to f32::MAX |
140 |
| - test_c!(0xfffffe80000000000000000000000001, u128 -> f32, f32::MAX); |
141 |
| - test_c!(0xfffffeffffffffffffffffffffffffff, u128 -> f32, f32::MAX); |
142 |
| - test_c!(0xffffff00000000000000000000000000, u128 -> f32, f32::MAX); |
143 |
| - test_c!(0xffffff00000000000000000000000001, u128 -> f32, f32::MAX); |
144 |
| - test_c!(0xffffff7fffffffffffffffffffffffff, u128 -> f32, f32::MAX); |
145 |
| - // f32::MAX + 0.5 ULP and greater should be rounded to infinity |
146 |
| - test_c!(0xffffff80000000000000000000000000, u128 -> f32, f32::INFINITY); |
147 |
| - test_c!(0xffffff80000000f00000000000000000, u128 -> f32, f32::INFINITY); |
148 |
| - test_c!(0xffffff87ffffffffffffffff00000001, u128 -> f32, f32::INFINITY); |
149 |
| - |
150 |
| - // u128->f64 should not be affected by the u128->f32 checks |
151 |
| - test_c!(0xffffff80000000000000000000000000, u128 -> f64, |
152 |
| - 340282356779733661637539395458142568448.0); |
153 |
| - test_c!(u128::MAX, u128 -> f64, 340282366920938463463374607431768211455.0); |
| 135 | + #[cfg(not(target_os="emscripten"))] |
| 136 | + { |
| 137 | + // float->int: |
| 138 | + test_c!(f32::MAX, f32 -> u128, 0xffffff00000000000000000000000000); |
| 139 | + // nextDown(f32::MAX) = 2^128 - 2 * 2^104 |
| 140 | + const SECOND_LARGEST_F32: f32 = 340282326356119256160033759537265639424.; |
| 141 | + test_c!(SECOND_LARGEST_F32, f32 -> u128, 0xfffffe00000000000000000000000000); |
| 142 | + |
| 143 | + // int->float: |
| 144 | + // f32::MAX - 0.5 ULP and smaller should be rounded down |
| 145 | + test_c!(0xfffffe00000000000000000000000000, u128 -> f32, SECOND_LARGEST_F32); |
| 146 | + test_c!(0xfffffe7fffffffffffffffffffffffff, u128 -> f32, SECOND_LARGEST_F32); |
| 147 | + test_c!(0xfffffe80000000000000000000000000, u128 -> f32, SECOND_LARGEST_F32); |
| 148 | + // numbers within < 0.5 ULP of f32::MAX it should be rounded to f32::MAX |
| 149 | + test_c!(0xfffffe80000000000000000000000001, u128 -> f32, f32::MAX); |
| 150 | + test_c!(0xfffffeffffffffffffffffffffffffff, u128 -> f32, f32::MAX); |
| 151 | + test_c!(0xffffff00000000000000000000000000, u128 -> f32, f32::MAX); |
| 152 | + test_c!(0xffffff00000000000000000000000001, u128 -> f32, f32::MAX); |
| 153 | + test_c!(0xffffff7fffffffffffffffffffffffff, u128 -> f32, f32::MAX); |
| 154 | + // f32::MAX + 0.5 ULP and greater should be rounded to infinity |
| 155 | + test_c!(0xffffff80000000000000000000000000, u128 -> f32, f32::INFINITY); |
| 156 | + test_c!(0xffffff80000000f00000000000000000, u128 -> f32, f32::INFINITY); |
| 157 | + test_c!(0xffffff87ffffffffffffffff00000001, u128 -> f32, f32::INFINITY); |
| 158 | + |
| 159 | + // u128->f64 should not be affected by the u128->f32 checks |
| 160 | + test_c!(0xffffff80000000000000000000000000, u128 -> f64, |
| 161 | + 340282356779733661637539395458142568448.0); |
| 162 | + test_c!(u128::MAX, u128 -> f64, 340282366920938463463374607431768211455.0); |
| 163 | + } |
154 | 164 | }
|
0 commit comments