Jump to page: 1 2
Thread overview
Int to float?
Mar 05, 2015
Taylor Hillegeist
Mar 05, 2015
Benjamin Thaut
Mar 05, 2015
Taylor Hillegeist
Mar 05, 2015
Jesse Phillips
Mar 06, 2015
bearophile
Mar 06, 2015
Nicolas Sicard
Mar 05, 2015
anonymous
Mar 05, 2015
badlink
Mar 05, 2015
anonymous
Mar 05, 2015
Adam D. Ruppe
March 05, 2015
How to I cast a Int to float without changing its binary representation?
March 05, 2015
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
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
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
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
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
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
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
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
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
« First   ‹ Prev
1 2