]>
git.proxmox.com Git - rustc.git/blob - library/core/tests/num/int_log.rs
1 //! This tests the `Integer::{ilog,log2,log10}` methods. These tests are in a
2 //! separate file because there's both a large number of them, and not all tests
3 //! can be run on Android. This is because in Android `ilog2` uses an imprecise
4 //! approximation:https://github.com/rust-lang/rust/blob/4825e12fc9c79954aa0fe18f5521efa6c19c7539/src/libstd/sys/unix/android.rs#L27-L53
8 assert_eq
!(999u32.checked_ilog(10), Some(2));
9 assert_eq
!(1000u32.checked_ilog(10), Some(3));
10 assert_eq
!(555u32.checked_ilog(13), Some(2));
11 assert_eq
!(63u32.checked_ilog(4), Some(2));
12 assert_eq
!(64u32.checked_ilog(4), Some(3));
13 assert_eq
!(10460353203u64.checked_ilog(3), Some(21));
14 assert_eq
!(10460353202u64.checked_ilog(3), Some(20));
15 assert_eq
!(147808829414345923316083210206383297601u128.checked_ilog(3), Some(80));
16 assert_eq
!(147808829414345923316083210206383297600u128.checked_ilog(3), Some(79));
17 assert_eq
!(22528399544939174411840147874772641u128.checked_ilog(19683), Some(8));
18 assert_eq
!(22528399544939174411840147874772631i128.checked_ilog(19683), Some(7));
20 assert_eq
!(0u8.checked_ilog(4), None
);
21 assert_eq
!(0u16.checked_ilog(4), None
);
22 assert_eq
!(0i8.checked_ilog(4), None
);
23 assert_eq
!(0i16.checked_ilog(4), None
);
25 #[cfg(not(miri))] // Miri is too slow
26 for i
in i16::MIN
..=0 {
27 assert_eq
!(i
.checked_ilog(4), None
);
29 #[cfg(not(miri))] // Miri is too slow
30 for i
in 1..=i16::MAX
{
31 assert_eq
!(i
.checked_ilog(13), Some((i
as f32).log(13.0) as u32));
33 #[cfg(not(miri))] // Miri is too slow
34 for i
in 1..=u16::MAX
{
35 assert_eq
!(i
.checked_ilog(13), Some((i
as f32).log(13.0) as u32));
41 assert_eq
!(5u32.checked_ilog2(), Some(2));
42 assert_eq
!(0u64.checked_ilog2(), None
);
43 assert_eq
!(128i32.checked_ilog2(), Some(7));
44 assert_eq
!((-55i16).checked_ilog2(), None
);
46 assert_eq
!(0u8.checked_ilog2(), None
);
47 assert_eq
!(0u16.checked_ilog2(), None
);
48 assert_eq
!(0i8.checked_ilog2(), None
);
49 assert_eq
!(0i16.checked_ilog2(), None
);
51 for i
in 1..=u8::MAX
{
52 assert_eq
!(i
.checked_ilog2(), Some((i
as f32).log2() as u32));
54 #[cfg(not(miri))] // Miri is too slow
55 for i
in 1..=u16::MAX
{
56 // Guard against Android's imprecise f32::ilog2 implementation.
57 if i
!= 8192 && i
!= 32768 {
58 assert_eq
!(i
.checked_ilog2(), Some((i
as f32).log2() as u32));
61 for i
in i8::MIN
..=0 {
62 assert_eq
!(i
.checked_ilog2(), None
);
64 for i
in 1..=i8::MAX
{
65 assert_eq
!(i
.checked_ilog2(), Some((i
as f32).log2() as u32));
67 #[cfg(not(miri))] // Miri is too slow
68 for i
in i16::MIN
..=0 {
69 assert_eq
!(i
.checked_ilog2(), None
);
71 #[cfg(not(miri))] // Miri is too slow
72 for i
in 1..=i16::MAX
{
73 // Guard against Android's imprecise f32::ilog2 implementation.
75 assert_eq
!(i
.checked_ilog2(), Some((i
as f32).log2() as u32));
80 // Validate cases that fail on Android's imprecise float ilog2 implementation.
82 #[cfg(not(target_os = "android"))]
83 fn checked_ilog2_not_android() {
84 assert_eq
!(8192u16.checked_ilog2(), Some((8192f32).log2() as u32));
85 assert_eq
!(32768u16.checked_ilog2(), Some((32768f32).log2() as u32));
86 assert_eq
!(8192i16.checked_ilog2(), Some((8192f32).log2() as u32));
91 assert_eq
!(0u8.checked_ilog10(), None
);
92 assert_eq
!(0u16.checked_ilog10(), None
);
93 assert_eq
!(0i8.checked_ilog10(), None
);
94 assert_eq
!(0i16.checked_ilog10(), None
);
96 #[cfg(not(miri))] // Miri is too slow
97 for i
in i16::MIN
..=0 {
98 assert_eq
!(i
.checked_ilog10(), None
);
100 #[cfg(not(miri))] // Miri is too slow
101 for i
in 1..=i16::MAX
{
102 assert_eq
!(i
.checked_ilog10(), Some((i
as f32).log10() as u32));
104 #[cfg(not(miri))] // Miri is too slow
105 for i
in 1..=u16::MAX
{
106 assert_eq
!(i
.checked_ilog10(), Some((i
as f32).log10() as u32));
108 #[cfg(not(miri))] // Miri is too slow
109 for i
in 1..=100_000u32 {
110 assert_eq
!(i
.checked_ilog10(), Some((i
as f32).log10() as u32));
114 macro_rules
! ilog10_loop
{
115 ($T
:ty
, $ilog10_max
:expr
) => {
116 assert_eq
!(<$T
>::MAX
.ilog10(), $ilog10_max
);
117 for i
in 0..=$ilog10_max
{
118 let p
= (10 as $T
).pow(i
as u32);
120 assert_eq
!((p
- 9).ilog10(), i
- 1);
121 assert_eq
!((p
- 1).ilog10(), i
- 1);
123 assert_eq
!(p
.ilog10(), i
);
124 assert_eq
!((p
+ 1).ilog10(), i
);
126 assert_eq
!((p
+ 9).ilog10(), i
);
129 // also check `x.ilog(10)`
131 assert_eq
!((p
- 9).ilog(10), i
- 1);
132 assert_eq
!((p
- 1).ilog(10), i
- 1);
134 assert_eq
!(p
.ilog(10), i
);
135 assert_eq
!((p
+ 1).ilog(10), i
);
137 assert_eq
!((p
+ 9).ilog(10), i
);
145 ilog10_loop
! { u8, 2 }
150 ilog10_loop
! { u16, 4 }
155 ilog10_loop
! { u32, 9 }
160 ilog10_loop
! { u64, 19 }
165 ilog10_loop
! { u128, 38 }