/ proofs / ilog10.txt
ilog10.txt
 1  ==== Integer log 10
 2  
 3  .Implementation
 4  [source]
 5  ----
 6  #include "nlz.h"
 7  
 8  // "one table lookup, branch free" (figure 11-12)
 9  inline int ilog10(unsigned x) {
10      int y;
11      static unsigned table[11] = {0, 9, 99, 999, 9999,
12  	99999, 999999, 9999999, 99999999, 999999999, 0xFFFFFFFF};
13      
14      y = (19*(31 - nlz(x))) >> 6;
15      return y + ((table[y+1]-x) >> 31);
16  }
17  ----
18  
19  
20  .Proof
21  [source]
22  ----
23  // "simple table search" (figure 11-7)
24  int ilog10_simple(unsigned x) {
25      int i;
26      static unsigned table[11] = {0, 9, 99, 999, 9999,
27  	99999, 999999, 9999999, 99999999, 999999999, 0xFFFFFFFF};
28      for(i = -1; i < 11; i++)
29  	if(x <= table[i+1]) return i;
30      assert(0);
31  }
32  
33  int main() {
34      unsigned u = nondet_unsigned();
35      assume(u);
36      assert(ilog10_simple(u) == ilog10(u));
37  }
38  ----