The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use Acme::Tools;
my $cool=resolve(sub{(bfdimensions(1e6,$_[0]))[0]/8-1e6},0,0.02);
my(@tm1,@tm2);
my @cap=map 10**$_,1..12;
my @er=qw/0.99 0.5 0.1 0.01 0.001 0.0001 0.00001 0.000001 0.0000001 0.00000001 0.000000001/;splice@er,3,0,$cool;
for my $cap (@cap){
  for my $er (@er){
    my($m1,$k1)=Acme::Tools::bfdimensions_old($cap,$er);
    my($m2,$k2)=Acme::Tools::bfdimensions($cap,$er);
    push @tm1,[$cap,"Error-rate\n$er",sprintf("%.4g",0.5+$m1/8)];
    push @tm2,[$cap,"Error-rate\n$er",sprintf("%.4g",0.5+$m2/8)];
  }
}
print "Storage, method 1 (bytes):\n".tablestring([pivot(\@tm1,"Capacity")]),"\n";
print "Storage, method 2 (bytes):\n".tablestring([pivot(\@tm2,"Capacity")]),"\n";

for(@er){
  printf "Error rate: %18s   Hash functions(1): %2d   Hash functions(2): %2d\n",
    $_,
    (Acme::Tools::bfdimensions_old(1,$_))[1],
    (Acme::Tools::bfdimensions(1,$_))[1],
}