Skip to content

Instantly share code, notes, and snippets.

@leptos-null
Last active December 23, 2019 06:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leptos-null/6f3eab11ebaf207bbbdb90c56178844c to your computer and use it in GitHub Desktop.
Save leptos-null/6f3eab11ebaf207bbbdb90c56178844c to your computer and use it in GitHub Desktop.
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
    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.

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