This looks unexpected -

* (specifier-type '(member -0d0 +0d0 foo))
=> #<UNION-TYPE (OR (MEMBER 0.0d0 FOO) (DOUBLE-FLOAT 0.0d0 0.0d0))>

I would have thought it to be
#<UNION-TYPE (OR (MEMBER FOO) (DOUBLE-FLOAT 0.0d0 0.0d0))>

If only one of the zeros is present, it results in a MEMBER type as expected:
(specifier-type '(member -0d0 foo)) => #<MEMBER-TYPE (MEMBER -0.0d0 FOO)>

But if both +/-0 are in the set, it produces a true numeric range type:
(specifier-type '(member -0d0 +0d0)) => #<NUMERIC-TYPE (DOUBLE-FLOAT 0.0d0 0.0d0)>

Canonicalization doesn't perform the "opposite" transformation of augmenting this union's MEMBER part with an fp-zero:
(specifier-type '(OR (MEMBER FOO) (DOUBLE-FLOAT 0.0d0 0.0d0)))
=> #<UNION-TYPE (OR (MEMBER FOO) (DOUBLE-FLOAT 0.0d0 0.0d0))>

So is it right that adding FOO in the first example includes positive 0d0 in the (MEMBER) part of the union even though it's redundant?