fork download
  1. #!/usr/bin/perl
  2.  
  3. # Idiom #263 Integer logarithm in base 2
  4.  
  5. use POSIX qw( log2 ilogb logb floor ceil );
  6.  
  7. sub log2d { floor log2 shift };
  8.  
  9. sub log2u { ceil log2 shift };
  10.  
  11.  
  12. my @cols = qw( iter value log2 rnd-dn log2d rnd-up log2u logb ilogb diff );
  13.  
  14. printf '%9s ' x @cols . "\n", @cols;
  15.  
  16. foreach my $iter ( 1..20 ) {
  17. my $r = rand(1000);
  18.  
  19. my %z = (
  20. '1_i' => $iter,
  21. '2_value' => $r,
  22. '3_log2' => log2($r),
  23. '4_rnd-dn' => floor(log($r)/log(2)),
  24. '5_log2d' => log2d($r),
  25. '6_rnd-up' => ceil(log($r)/log(2)),
  26. '7_log2u' => log2u($r),
  27. '8_logb' => logb($r),
  28. '9_ilogb' => ilogb($r),
  29. );
  30.  
  31. my @diff;
  32. push @diff, 'log2d ' if $z{'4_rnd-dn'} != $z{'5_log2d'};
  33. push @diff, 'log2u ' if $z{'6_rnd-up'} != $z{'7_log2u'};
  34. my $diff = @diff ? join ', ', @diff : 'none';
  35.  
  36. my @values = map { $z{$_} } sort keys %z;
  37. printf '%9G ' x @values . "%10s\n", @values, $diff;
  38.  
  39. }
  40. printf "\n\nThe diff column indicates whether any differences were " .
  41. "found between rnd-dn and log2d or rnd-up and log2u\n";
  42.  
  43.  
Success #stdin #stdout 0.02s 7108KB
stdin
Standard input is empty
stdout
     iter     value      log2    rnd-dn     log2d    rnd-up     log2u      logb     ilogb      diff 
        1   428.804   8.74418         8         8         9         9         8         8       none
        2    816.22   9.67281         9         9        10        10         9         9       none
        3   464.312   8.85895         8         8         9         9         8         8       none
        4   688.488   9.42729         9         9        10        10         9         9       none
        5   277.701   8.11739         8         8         9         9         8         8       none
        6   127.977   6.99974         6         6         7         7         6         6       none
        7   509.645   8.99335         8         8         9         9         8         8       none
        8   783.854   9.61444         9         9        10        10         9         9       none
        9   354.897   8.47126         8         8         9         9         8         8       none
       10   382.978   8.58112         8         8         9         9         8         8       none
       11   324.061   8.34012         8         8         9         9         8         8       none
       12   127.353   6.99269         6         6         7         7         6         6       none
       13   828.026   9.69353         9         9        10        10         9         9       none
       14   391.813   8.61402         8         8         9         9         8         8       none
       15   101.025   6.65857         6         6         7         7         6         6       none
       16    463.52   8.85649         8         8         9         9         8         8       none
       17   54.6556    5.7723         5         5         6         6         5         5       none
       18   998.836    9.9641         9         9        10        10         9         9       none
       19    58.697   5.87521         5         5         6         6         5         5       none
       20   554.748   9.11569         9         9        10        10         9         9       none


The diff column indicates whether any differences were found between rnd-dn and log2d or rnd-up and log2u