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.