statistics: NormalDist Subtraction Has the Same Spread as Addition (tested)
It's natural to expect subtracting two distributions to cancel out some of their uncertainty, the way subtracting two numbers can land closer to zero. We measured NormalDist's + and - operators directly and found the spread (stdev) of the result is identical either way.
1. Addition and subtraction produce different means but the exact same stdev
from statistics import NormalDist
a = NormalDist(10, 2)
b = NormalDist(5, 1)
print(a + b)
print(a - b)
NormalDist(mu=15.0, sigma=2.23606797749979)
NormalDist(mu=5.0, sigma=2.23606797749979)
Measured: the mean (mu) changes as expected -- 15.0 for the sum, 5.0 for the difference -- but the spread (sigma, statistics.NormalDist's name for standard deviation) is identical in both cases: 2.236.
2. This matches the math: variance adds, it never subtracts
import math
from statistics import NormalDist
a = NormalDist(10, 2)
b = NormalDist(5, 1)
print((a + b).stdev == (a - b).stdev)
print(math.sqrt(a.variance + b.variance))
True
2.23606797749979
Measured: both a + b and a - b have a stdev equal to sqrt(a.variance + b.variance) -- variances of independent distributions always add, regardless of whether the means are being added or subtracted. There's no operation on two independent NormalDist instances that produces a narrower result than either input alone.
3. The only way to shrink spread is scaling by a constant below 1, not combining two distributions
from statistics import NormalDist
a = NormalDist(10, 2)
print(a * 0.5)
print(a - NormalDist(5, 1))
NormalDist(mu=5.0, sigma=1.0)
NormalDist(mu=5.0, sigma=2.23606797749979)
Measured: multiplying a single NormalDist by a constant below 1 does shrink sigma proportionally -- but subtracting a second, independent distribution with the same target mean does not, even though intuitively it "removes" something. This is correct probability theory (independent uncertainties combine, they don't cancel), but it's a common trap when modeling something like "expected delivery time minus expected prep time" as two NormalDist objects and assuming the result is more precise than either input -- it's actually less precise (wider) than either one alone, and exactly as wide as if the two had been added instead. If the two quantities aren't actually independent (e.g. one is measured as a function of the other), this model doesn't apply at all -- NormalDist arithmetic always assumes independence.
Frequently asked questions
Does subtracting two NormalDist distributions produce a tighter (smaller stdev) result?
No -- we measured NormalDist(10,2) - NormalDist(5,1) having the exact same stdev (2.236) as NormalDist(10,2) + NormalDist(5,1). Variances of independent distributions add regardless of whether you're combining them with + or -.
Why does NormalDist subtraction have the same spread as addition?
For independent random variables, variance always adds when you combine them, whether by addition or subtraction, because subtracting a random quantity doesn't reduce uncertainty about it -- it's still an independent unknown contributing its own variance. We confirmed (a - b).stdev equals sqrt(a.variance + b.variance), the same formula as for a + b.
How do I reduce the spread of a NormalDist?
Multiply it by a constant less than 1 -- we measured NormalDist(10, 2) * 0.5 returning sigma=1.0, proportionally scaled down. Combining it with a second independent NormalDist via + or - will never narrow it, only widen it.
Can I use NormalDist subtraction to model the difference between two dependent measurements?
No -- NormalDist's arithmetic operators assume the two distributions are independent. If one quantity depends on the other (e.g. derived from it), the resulting stdev calculation from + or - won't be valid, since real variance only adds this way for independent variables.
Written with AI assistance. Measured on 2026-10-04 with Python 3.13.5's built-in statistics module: added and subtracted two independent NormalDist instances and compared the resulting stdev in each case. PlainHeaders is our extension; Python's statistics module is built in.