@@ -97,3 +97,57 @@ fn checked_log10() {
9797 assert_eq ! ( i. checked_log10( ) , Some ( ( i as f32 ) . log10( ) as u16 ) ) ;
9898 }
9999}
100+
101+ macro_rules! log10_loop {
102+ ( $T: ty, $log10_max: expr) => {
103+ assert_eq!( <$T>:: MAX . log10( ) , $log10_max) ;
104+ for i in 0 ..=$log10_max {
105+ let p = ( 10 as $T) . pow( i as u32 ) ;
106+ if p >= 10 {
107+ assert_eq!( ( p - 9 ) . log10( ) , i - 1 ) ;
108+ assert_eq!( ( p - 1 ) . log10( ) , i - 1 ) ;
109+ }
110+ assert_eq!( p. log10( ) , i) ;
111+ assert_eq!( ( p + 1 ) . log10( ) , i) ;
112+ if p >= 10 {
113+ assert_eq!( ( p + 9 ) . log10( ) , i) ;
114+ }
115+
116+ // also check `x.log(10)`
117+ if p >= 10 {
118+ assert_eq!( ( p - 9 ) . log( 10 ) , i - 1 ) ;
119+ assert_eq!( ( p - 1 ) . log( 10 ) , i - 1 ) ;
120+ }
121+ assert_eq!( p. log( 10 ) , i) ;
122+ assert_eq!( ( p + 1 ) . log( 10 ) , i) ;
123+ if p >= 10 {
124+ assert_eq!( ( p + 9 ) . log( 10 ) , i) ;
125+ }
126+ }
127+ } ;
128+ }
129+
130+ #[ test]
131+ fn log10_u8 ( ) {
132+ log10_loop ! { u8 , 2 }
133+ }
134+
135+ #[ test]
136+ fn log10_u16 ( ) {
137+ log10_loop ! { u16 , 4 }
138+ }
139+
140+ #[ test]
141+ fn log10_u32 ( ) {
142+ log10_loop ! { u32 , 9 }
143+ }
144+
145+ #[ test]
146+ fn log10_u64 ( ) {
147+ log10_loop ! { u64 , 19 }
148+ }
149+
150+ #[ test]
151+ fn log10_u128 ( ) {
152+ log10_loop ! { u128 , 38 }
153+ }
0 commit comments