digitalmars.D.learn - reinterpret_cast float to uint
Hi, floats are stored on 32 bits using ieee754...and I would like (for some obscure reason) to reinterpret a such float into a 32 bits uint (i.e without altering the memory). A simple : import std.stdio; void main() { float f = 0.5; uint i = cast(uint)(f); writeln(i); } doesn't work since it just round the float. In C++, I do : reinterpret_cast<std::size_t&>(my_float). How could I do this in D ? Thanks in advance for your help !
Mar 29 2015
On Sunday, 29 March 2015 at 13:39:47 UTC, matovitch wrote:Hi, floats are stored on 32 bits using ieee754...and I would like (for some obscure reason) to reinterpret a such float into a 32 bits uint (i.e without altering the memory). A simple : import std.stdio; void main() { float f = 0.5; uint i = cast(uint)(f); writeln(i); } doesn't work since it just round the float. In C++, I do : reinterpret_cast<std::size_t&>(my_float). How could I do this in D ? Thanks in advance for your help !Ok this works : import std.stdio; void main() { float f = 0.5; uint i = *cast(uint*)(&f); writeln(i); } It is kind of logical...I feel a bit dumb. :D
Mar 29 2015
On Sun, 29 Mar 2015 13:45:10 +0000, matovitch wrote: you can also use unions.=
Mar 29 2015
On Sunday, 29 March 2015 at 14:50:24 UTC, ketmar wrote:On Sun, 29 Mar 2015 13:45:10 +0000, matovitch wrote: you can also use unions.Good idea ! In my case I think it was better to cast, but this could be helpful another time thanks ! :)
Mar 29 2015
On Sun, 29 Mar 2015 16:00:05 +0000, matovitch wrote:On Sunday, 29 March 2015 at 14:50:24 UTC, ketmar wrote:unions also looks better than pointers, and they are easier to read, i=20 think. ;-) union FU { float f; uint u; } void main () pure { float t =3D 42.0; assert((cast(FU)t).u =3D=3D 0x42280000); }=On Sun, 29 Mar 2015 13:45:10 +0000, matovitch wrote: you can also use unions.=20 Good idea ! In my case I think it was better to cast, but this could be helpful another time thanks ! :)
Mar 29 2015
On Sunday, 29 March 2015 at 16:29:40 UTC, ketmar wrote:On Sun, 29 Mar 2015 16:00:05 +0000, matovitch wrote:AFAIK this would be undefined behaviour in C++, right?On Sunday, 29 March 2015 at 14:50:24 UTC, ketmar wrote:unions also looks better than pointers, and they are easier to read, i think. ;-) union FU { float f; uint u; } void main () pure { float t = 42.0; assert((cast(FU)t).u == 0x42280000); }On Sun, 29 Mar 2015 13:45:10 +0000, matovitch wrote: you can also use unions.Good idea ! In my case I think it was better to cast, but this could be helpful another time thanks ! :)
Mar 29 2015
On Sun, 29 Mar 2015 17:33:02 +0000, Namespace wrote:On Sunday, 29 March 2015 at 16:29:40 UTC, ketmar wrote:i honestly don't remember. C++ itself is UB. ;-)=On Sun, 29 Mar 2015 16:00:05 +0000, matovitch wrote:=20 AFAIK this would be undefined behaviour in C++, right?On Sunday, 29 March 2015 at 14:50:24 UTC, ketmar wrote:unions also looks better than pointers, and they are easier to read, i think. ;-) union FU { float f; uint u; } void main () pure { float t =3D 42.0; assert((cast(FU)t).u =3D=3D 0x42280000); }On Sun, 29 Mar 2015 13:45:10 +0000, matovitch wrote: you can also use unions.=20 Good idea ! In my case I think it was better to cast, but this could be helpful another time thanks ! :)
Mar 29 2015