This creates a real, not an imaginary. It shouldn't compile at all.
> # union I{
> # ifloat f;
> # uint i;
> # }
> #
> # void foo(){
> # I i;
> # i.f = 0.0fi;
> # i.f *= -1.0fi; << This should be i.f *= -1.0f;
> # assert(i.i == 0x80000000);
> # }