+static double context_get_percentile (ping_context_t *ctx, /* {{{ */
+ double percentile)
+{
+ double threshold = percentile / 100.0;
+ uint32_t accumulated[ctx->latency_histogram_size];
+ double ratios[ctx->latency_histogram_size];
+ double index_to_ms_factor;
+ uint32_t num;
+ size_t i;
+
+ if (ctx->latency_histogram == NULL)
+ return (NAN);
+
+ accumulated[0] = ctx->latency_histogram[0];
+ for (i = 1; i < ctx->latency_histogram_size; i++)
+ accumulated[i] = accumulated[i - 1]
+ + ctx->latency_histogram[i];
+ num = accumulated[ctx->latency_histogram_size - 1];
+
+ for (i = 0; i < ctx->latency_histogram_size; i++)
+ {
+ ratios[i] = ((double) accumulated[i]) / ((double) num);
+ if (ratios[i] >= threshold)
+ break;
+ }
+
+ if (i >= ctx->latency_histogram_size)
+ return (NAN);
+ else if (i == (ctx->latency_histogram_size - 1))
+ return (INFINITY);
+
+ index_to_ms_factor = (1000.0 * opt_interval) / (ctx->latency_histogram_size - 1);
+
+ /* Multiply with i+1, because we're interested in the _upper_ bound of
+ * each bucket. */
+ return (index_to_ms_factor * ((double) (i + 1)));
+} /* }}} double context_get_percentile */
+