No heap allocation is done, since it's a temporary and is not stored.
The improvement comes from the fact that the explicit conversion is done at compile time (just generating a ```(double)$im```) while the implicit conversion is done at runtime and requires additional type checking.
I get a 3x improvement thanks to this change.

Here you can see the generated C codes.
Before:

```c
T2 = TlastTVfasta;
T14 = primitive_cast_integer_as_raw(T2);
T15 = primitive_machine_word_shift_right(T14,2);
T16 = primitive_integer_as_double_float(T15);
T17 = primitive_double_float_as_raw(max_value_);
T18 = primitive_double_float_multiply(T17,T16);
T19 = primitive_raw_as_double_float(T18);
T20_0 = KSVKdMM0I(T19, (D) 559873);
T3_0 = T20_0;
{
  MV_CHECK_TYPE_PROLOGUE(T20_0);
  primitive_type_check(T3_0, &KLdouble_floatGVKd);
  MV_CHECK_TYPE_EPILOGUE();
}
MV_SET_COUNT(1);
return(T3_0);
```

After:
```c
T2 = TlastTVfasta;
T13 = primitive_cast_integer_as_raw(T2);
T14 = primitive_machine_word_shift_right(T13,2);
T15 = primitive_integer_as_double_float(T14);
T16 = primitive_double_float_as_raw(max_value_);
T17 = primitive_double_float_multiply(T16,T15);
T18 = primitive_double_float_divide(T17,139968.00e0);
T19 = primitive_raw_as_double_float(T18);
T20_0 = T19;
MV_SET_COUNT(1);
return(T20_0);
```