Comment #0 by ellery-newcomer — 2012-08-08T12:55:19Z
doesn't work, but should.
enum string s = "0x9.D70A3D70A3D70A4p-3";
enum d2 = to!real(s);
pragma(msg, d2);
gives me:
/usr/include/dmd-d/std/conv.d(2305): Error: Cannot convert &real to long* at compile time
/usr/include/dmd-d/std/conv.d(1592): called from here: parse(value)
/usr/include/dmd-d/std/conv.d(268): called from here: toImpl(_param_0)
test.d(14): called from here: to("0x9.D70A3D70A3D70A4p-3")
/usr/include/dmd-d/std/conv.d(2305): Error: Cannot convert &real to long* at compile time
/usr/include/dmd-d/std/conv.d(1592): called from here: parse(value)
/usr/include/dmd-d/std/conv.d(268): called from here: toImpl(_param_0)
test.d(15): called from here: to("0x9.D70A3D70A3D70A4p-3")
to("0x9.D70A3D70A3D70A4p-3")
however,
double d = to!real(s);
writeln(d);
compiles and prints
1.23
Comment #1 by peter.alexander.au — 2013-01-05T12:03:21Z
Added CTFE tag. I don't think there's any sane way to do this without CTFE support for the pointer cast, or at least unions.
Got rid of all the hex bit-packing in `std.conv.parse`, only missing bit is the call to C's `ldexp`, which still causes this to fail at compile-time. You can replace that with manual exponentiation if wanted to fix this, just as done for decimal strings now.
Comment #4 by robert.schadek — 2024-12-01T16:15:28Z