Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
March 05, 2015 Int to float? | ||||
---|---|---|---|---|
| ||||
How to I cast a Int to float without changing its binary representation? |
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Taylor Hillegeist | Am 05.03.2015 um 21:00 schrieb Taylor Hillegeist: > How to I cast a Int to float without changing its binary representation? int someValue = 5; float sameBinary = *(cast(float*)cast(void*)&someValue); |
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Benjamin Thaut | On Thursday, 5 March 2015 at 20:03:09 UTC, Benjamin Thaut wrote:
> Am 05.03.2015 um 21:00 schrieb Taylor Hillegeist:
>> How to I cast a Int to float without changing its binary representation?
>
> int someValue = 5;
> float sameBinary = *(cast(float*)cast(void*)&someValue);
ahh of course! lol :)
|
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Benjamin Thaut | On Thursday, 5 March 2015 at 20:03:09 UTC, Benjamin Thaut wrote:
> int someValue = 5;
> float sameBinary = *(cast(float*)cast(void*)&someValue);
The cast(void*) isn't necessary.
|
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Thursday, 5 March 2015 at 20:16:55 UTC, anonymous wrote: > On Thursday, 5 March 2015 at 20:03:09 UTC, Benjamin Thaut wrote: >> int someValue = 5; >> float sameBinary = *(cast(float*)cast(void*)&someValue); > > The cast(void*) isn't necessary. Actually even the cast is unecessary, just use a uniform. union N { int i; float f; } http://dpaste.dzfl.pl/58b6eddcf725 |
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to badlink | On Thursday, 5 March 2015 at 20:21:18 UTC, badlink wrote:
> On Thursday, 5 March 2015 at 20:16:55 UTC, anonymous wrote:
>> On Thursday, 5 March 2015 at 20:03:09 UTC, Benjamin Thaut wrote:
>>> int someValue = 5;
>>> float sameBinary = *(cast(float*)cast(void*)&someValue);
>>
>> The cast(void*) isn't necessary.
>
> Actually even the cast is unecessary, just use a uniform.
>
> union N {
> int i;
> float f;
> }
>
> http://dpaste.dzfl.pl/58b6eddcf725
That's not really simpler, though.
|
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Thursday, 5 March 2015 at 20:32:20 UTC, anonymous wrote:
> That's not really simpler, though.
Maybe, but I think the union is a bit nicer because then the compiler is responsible for more of the details. For example, it should work with class objects without the complication of dealing with the fact that they are already pointers under the hood.
Either way works though and should compile to the same instructions, just if I was doing it as a generic library, I think I'd use the union method.
|
March 05, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Taylor Hillegeist | On Thursday, 5 March 2015 at 20:06:55 UTC, Taylor Hillegeist wrote:
> On Thursday, 5 March 2015 at 20:03:09 UTC, Benjamin Thaut wrote:
>> Am 05.03.2015 um 21:00 schrieb Taylor Hillegeist:
>>> How to I cast a Int to float without changing its binary representation?
>>
>> int someValue = 5;
>> float sameBinary = *(cast(float*)cast(void*)&someValue);
>
> ahh of course! lol :)
I think I read somewhere you don't want to use unions like this, but I think it is more because you generally don't want to reinterpret bits.
import std.stdio;
void main() {
union Fi {
float f;
int i;
}
Fi fi;
fi.i = 65;
writeln(fi.f);
}
|
March 06, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jesse Phillips | On Thursday, 5 March 2015 at 23:50:28 UTC, Jesse Phillips wrote:
> I think I read somewhere you don't want to use unions like this, but I think it is more because you generally don't want to reinterpret bits.
It is non-portable, since some hardware architectures may use different representations (e.g. different byte order on int and float).
D claims to follow C, so using unions for type punning is ultimately implementation defined.
In C++ using unions for type punning is illegal/undefined behaviour, so in C++ you should use memcpy. Memcpy also has the advantage of explicitly copying thus avoiding some aliasing issues.
|
March 06, 2015 Re: Int to float? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ola Fosheim Grøstad | Ola Fosheim Grøstad:
> D claims to follow C, so using unions for type punning is ultimately implementation defined.
I am not sure if D is the same as C regarding this.
Bye,
bearophile
|
Copyright © 1999-2021 by the D Language Foundation