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); > # }