99//! algorithm can be found in "ParseNumberF64 by Simple Decimal Conversion",
1010//! available online: <https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html>.
1111
12- use crate :: num:: dec2flt:: common:: { ByteSlice , is_8digits} ;
1312use crate :: kani;
13+ use crate :: num:: dec2flt:: common:: { ByteSlice , is_8digits} ;
1414
1515/// A decimal floating-point number, represented as a sequence of decimal digits.
1616#[ derive( Clone , Debug , PartialEq ) ]
@@ -132,9 +132,9 @@ impl DecimalSeq {
132132 let mut read_index = self . num_digits ;
133133 let mut write_index = self . num_digits + num_new_digits;
134134 let mut n = 0_u64 ;
135-
136- #[ kani:: loop_invariant( read_index <= Self :: MAX_DIGITS &&
137- write_index == read_index + num_new_digits &&
135+
136+ #[ kani:: loop_invariant( read_index <= Self :: MAX_DIGITS &&
137+ write_index == read_index + num_new_digits &&
138138 n < 10u64 << ( shift - 1 ) &&
139139 self . num_digits <= Self :: MAX_DIGITS &&
140140 self . decimal_point <= self . num_digits as i32 &&
@@ -207,8 +207,8 @@ impl DecimalSeq {
207207 return ;
208208 }
209209 let mask = ( 1_u64 << shift) - 1 ;
210- #[ kani:: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
211- write_index < read_index &&
210+ #[ kani:: loop_invariant( self . num_digits <= Self :: MAX_DIGITS &&
211+ write_index < read_index &&
212212 write_index < Self :: MAX_DIGITS - self . num_digits. saturating_sub( read_index)
213213 ) ]
214214 while read_index < self . num_digits {
@@ -408,13 +408,14 @@ pub mod decimal_seq_verify {
408408 num_digits : kani:: any ( ) ,
409409 decimal_point : kani:: any ( ) ,
410410 truncated : kani:: any ( ) ,
411- digits : kani:: any ( ) } ;
411+ digits : kani:: any ( ) ,
412+ } ;
412413 kani:: assume ( a. num_digits <= DecimalSeq :: MAX_DIGITS ) ;
413- kani:: assume ( a. decimal_point >= 0 ) ;
414+ kani:: assume ( a. decimal_point >= 0 ) ;
414415 kani:: assume ( a. decimal_point <= a. num_digits as i32 ) ;
415416 kani:: assume ( kani:: forall!( |i in ( 0 , DecimalSeq :: MAX_DIGITS ) | a. digits[ i] <= 9 ) ) ;
416- ret
417- }
417+ ret
418+ }
418419 }
419420
420421 #[ kani:: proof]
@@ -428,13 +429,16 @@ pub mod decimal_seq_verify {
428429 let mut a: DecimalSeq = kani:: any ( ) ;
429430 let shift: usize = kani:: any_where ( |x| * x > 0 && * x <= 60 ) ;
430431 let n = number_of_digits_decimal_left_shift ( & a, shift) ;
432+ // 19 is the greatest number x such that 10u64^x does not overflow
433+ // It is also TABLE.max << 11
431434 assert ! ( n <= 19 ) ;
432435 assert ! ( n == 19 || 1u64 << shift < 10u64 . pow( n as u32 + 1 ) )
433436 }
434437
435438 #[ kani:: proof]
436439 fn check_right_shift ( ) {
437440 let mut a: DecimalSeq = kani:: any ( ) ;
441+ //This function is called in parse_long_mantissa function (slow.rs), in which the maximum of shift is 60
438442 let shift: usize = kani:: any_where ( |x| * x > 0 && * x <= 60 ) ;
439443 a. right_shift ( shift) ;
440444 }
0 commit comments