What’s it mean if the temperature is going to be 30% warmer or 30% cooler?
Let’s take something that we know works: distances. If I have a distance that’s 2 meters, 30% more is (x=2, s=0.3; x*(1+s)
) 2.6 meters, and 30% less is (x=2, s=-0.3; x*(1+s)
) 1.4 meters. Covert these three values to feet, you get 6.56
, 8.53
, and 4.59
respectively. If we plug these numbers back into our scaling equation: more is (x=6.56, s=0.3; x*(1+s)
) 8.528 feet, and less is (x=6.56, s=-0.3; x*(1+s)
) 4.592 feet. These values are slightly off due to rounding.
The problem with temperature is that it’s not zero-based. A value some incremental amount warmer than 5 degrees Fahrenheit is still cold. We need to “normalize” temperature. To do that, we have to find a value such that anything warmer feels warmer, and anything cooler feels cooler. We’re going to use 22°C (72°F) for this value.
Our abstract equation looks like this: (temperature - normalize)*(1 + scale) + normalize
where normalize
is the temperature discussed in the above paragraph. For Celsius this will be (x-22)*(1+s) + 22
and for Fahrenheit (x-72)*(1+s) + 72
.
We’ll take a temperature of 25 Centigrade, 30% more is (x=25, s=0.3; (x-22)*(1+s) + 22
) 25.9 Centigrade, and 30% less is (x=25, s=-0.3; (x-22)*(1+s) + 22
) 24.1 Centigrade. Covert these three values to Fahrenheit, you get 77
, 78.62
, and 75.38
respectively. If we plug these numbers back into our scaling equation: more is (x=77, s=0.3; (x-72)*(1+s) + 72
) 78.5 Fahrenheit, and less is (x=77, s=-0.3; (x-72)*(1+s) + 72
) 75.5 Fahrenheit. These values are slightly off due to rounding.
With normal scales (e.g. distance, time) or abnormal scales (e.g. temperature), the equations I wrote above don’t work correctly when the starting value is negative (e.g. -4 meters). For these cases, the scale needs to go in the other direction.
We can write a general function, with a normalize
value such that normalize
is a point that fits our earlier criteria: a change in sign correlates a logical change in meaning (e.g. distance from the start line of a race is negative before the line, and positive after the line).
def scale_unit(value, scale, normalize = 0):
x = value - normalize
s = 1
if (x < 0):
s -= scale
else:
s += scale
return x*s + normalize
We can try this out with negative distances: scale_unit(-4, 0.5)
returns -2 ("50% more than -4 is -2"), seems reasonable.
Let’s try some temperatures: scale_unit(50, 0.5, 72)
returns 61 ("50% warmer than 50 degrees is 61"), again seems reasonable. scale_unit(70, -0.6, 72)
returns 68.8, which continues to make sense.