code: double fullProbabilisticAlgorithmCardinality() {
          final int m = this.m/*for performance*/;
  
          // compute the "indicator function" -- sum(2^(-M[j])) where M[j] is the
          // 'j'th register value
          double sum = 0;
          int numberOfZeroes = 0/*"V" in the paper*/;
          final LongIterator iterator = probabilisticStorage.registerIterator();
          while(iterator.hasNext()) {
              final long register = iterator.next();
  
              sum += 1.0 / (1L << register);
              if(register == 0L) numberOfZeroes++;
          }
  
          // apply the estimate and correction to the indicator function
          final double estimator = alphaMSquared / sum;
          if((numberOfZeroes != 0) && (estimator < smallEstimatorCutoff)) {
              return HLLUtil.smallEstimator(m, numberOfZeroes);
          } else if(estimator <= largeEstimatorCutoff) {
              return estimator;
          } else {
              return HLLUtil.largeEstimator(log2m, regwidth, estimator);
          }
      }
docs: /*package, for testing