it's *not* safe to memoize floats, because 0.0 == -0.0