On Monday, 16 May 2016 at 09:54:51 UTC, Iain Buclaw wrote:
On 16 May 2016 at 10:52, Ola Fosheim Grøstad via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
On Monday, 16 May 2016 at 08:47:03 UTC, Iain Buclaw wrote:

But you *didn't* request coercion to 32 bit floats. Otherwise you would have used 1.30f.


        const float f = 1.3f;
        float c = f;
        assert(c*1.0 == f*1.0); // Fails! SHUTDOWN!



Your still using doubles. Are you intentionally missing the point?

I think you're missing what Ola means when he's talking about 32-bit floats. Of course when you multiply a float by a double (here, 1.0) you promote it to a double; but you'd expect the result to reflect the data available in the 32-bit float.

Whereas in Ola's example, the fact that `const float f` is known at compile-time means that the apparent 32-bit precision is in fact entirely ignored when doing the * 1.0 calculation.

In other words, Ola's expecting

    float * double == float * double

but is getting something more like

    float * double == double * double

or maybe even

    float * double == real * real

... because of the way FP constants are treated at compile time.

Reply via email to