- if (tuning->growth_threshold > 0.0
- && tuning->growth_threshold < 1.0
- && tuning->growth_factor > 1.0
- && tuning->shrink_threshold >= 0.0
- && tuning->shrink_threshold < 1.0
- && tuning->shrink_factor > tuning->shrink_threshold
- && tuning->shrink_factor <= 1.0
- && tuning->shrink_threshold < tuning->growth_threshold)
+ /* Be a bit stricter than mathematics would require, so that
+ rounding errors in size calculations do not cause allocations to
+ fail to grow or shrink as they should. The smallest allocation
+ is 11 (due to next_prime's algorithm), so an epsilon of 0.1
+ should be good enough. */
+ float epsilon = 0.1f;
+
+ if (epsilon < tuning->growth_threshold
+ && tuning->growth_threshold < 1 - epsilon
+ && 1 + epsilon < tuning->growth_factor
+ && 0 <= tuning->shrink_threshold
+ && tuning->shrink_threshold + epsilon < tuning->shrink_factor
+ && tuning->shrink_factor <= 1
+ && tuning->shrink_threshold + epsilon < tuning->growth_threshold)