I often use a variation on @matthias.scharfenber’s compression function, which adds two more parameters (c and d) to control the point at which compression begins, and the value it rolls off to (if compressing everything into the 0-1 range is not a requirement).
x < d + a ? x : d + (-1 / ((x - d - a) / (c - a) + 1) + 1) * (c - a) + a
I have to credit @Paul_Dore with showing me this one.