This question is probably "unusual", but I need to cast a float Number
to an integer Number
, without modifying its binary representation.
For example, the float 37.5
is represented by the bytes 0x42160000
(according to IEEE 754).
I need to reinterpret 0x42160000
as an integer, i.e. the number 1108738048
How do I do this? I'm thinking there could be some bitwise tricks to accomplish this?
To be clear, I'm not looking for Math.round
or parseInt
.
The conversion between the float and int values can be done using the assignment operator. In this case, the float variable will be implicitly converted to the int type, and the value will be narrowed down to the second type, losing all digits after the decimal point.
reinterpret_cast is a type of casting operator used in C++. It is used to convert a pointer of some data type into a pointer of another data type, even if the data types before and after conversion are different. It does not check if the pointer type and data pointed by the pointer is same or not.
It is purely a compile-time directive which instructs the compiler to treat expression as if it had the type new-type. Only the following conversions can be done with reinterpret_cast, except when such conversions would cast away constness or volatility.
Typed arrays can come in handy here: http://jsfiddle.net/rtYrM/.
// create array which is specialized for holding 1 float value
var floatArray = new Float32Array(1);
// set the float value
floatArray[0] = 37.5;
// use its buffer (4 bytes for 1 float) and pass it to an array
// specialized for integers
var intArray = new Int32Array(floatArray.buffer);
// the integer array will interpret the buffer bytes as an integer,
// which seems to be just what you want
intArray[0] === 1108738048; //true
intArray.buffer
will hold the same bytes as floatArray.buffer
, but by not accessing it with the buffer but with the array itself, it will read those bytes as the type specified by the typed array: as integers for Int32Array
, and as floats for Float32Array
.
In this case (in base 10):
floatArray
is set to the value [ 37.5 ]
.floatArray.buffer
is automatically set to the values [ 0, 0, 22, 66 ]
.floatArray.buffer
is passed to a new integer array, intArray
.intArray.buffer
therefore contains the values [ 0, 0, 22, 66 ]
as well.intArray
contains the value [ 1108738048 ]
, calculated with its buffer.I don't believe Javascript includes any mechanism for doing this. There's a method java.lang.Float.floatBitsToIntBits()
in Java, so depending on your intended environment you might be able to make use of that. If all else fails, you might have to send the data back to the server to be converted. Alternatively, I've seen attempts at Javascript methods to do this conversion, but never one that was 100% complete and correct.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With