public static void Main()
TimeSpan start = TimeSpan.Parse("00:05:00.123");
TimeSpan max = TimeSpan.Parse("00:15:00.23456");
var repeat = Enumerable.Range(0, 100);
foreach(var r in repeat){
var val = Calculate(start, max, r, 0.4);
Console.WriteLine($"max is: {max} function: {val} has reached max: {val == max}");
public static TimeSpan Calculate(TimeSpan initial, TimeSpan max, int offsetFactor, double growthConstant)
throw new ArgumentOutOfRangeException(nameof(max), $"Cannot be lower than {nameof(initial)}.");
double initialValue = (max.TotalMilliseconds / initial.TotalMilliseconds) - 1;
return TimeSpan.FromMilliseconds(max.TotalMilliseconds / (1 + initialValue * Math.Pow(Math.E, -growthConstant * offsetFactor)));