Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
How to scale temperature and other measurements

Temperature Scaling

What’s it mean if the temperature is going to be 30% warmer or 30% cooler?

Distance Scaling

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.

Fixing Temperature

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.

Dealing with a negative coefficient

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
        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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment