Left shift Float type

22,915

Solution 1

You can't left shift float variables, because (a) your FPU generally will not have a barrel shifter exposed to you so physically cannot generate code to do that, and (b) what would it even mean? The underlying bit representation consists of multiple fields with different meanings, do you really want those bits bleeding into each other?

If you want to multiply the number held in that variable by two, you should just do that instead.

If you want to reinterpret the float as some type that left shift makes sense on (e.g. a suitably large unsigned integer type) for some horrible bit hack like Carmack's square root, well, you can do that too, but on modern hardware it is highly unlikely that you really need to: seriously consider if there is a better way to do what you want.

Solution 2

Check out the standard function ldexpf if you want to quickly multiply or divide a float by a power of 2. A bit obscure obviously :-).

https://linux.die.net/man/3/ldexpf

Solution 3

Shifting floats makes no sense since it's represented as the concatenation of a sign bit, an exponent and a mantissa. Since shifting operation is about shifting bits, it would imply shifting bits from mantissa to exponent and / or to sign bit.

Solution 4

Since the left shift operator is defined as multiplication by a power of 2, it makes perfect sense for floating point types. However, the C language does not define its use, so instead you have to use the scalbn function or similar.

Share:
22,915
Akash
Author by

Akash

Tell me and i forget. Teach me and i remember. Involve me and i learn. - Benjamin Franklin

Updated on July 09, 2022

Comments

  • Akash
    Akash almost 2 years

    get a complier error while trying to do

    float_val=float_val<<1;
    

    It gives out a error saying "error C2296: '<<' : illegal, left operand has type 'float '"

    Can't v left shift float vars? Why is this so?

  • Oliver Charlesworth
    Oliver Charlesworth about 12 years
    +1. But to be pedantic, the FPU almost certainly will have a barrel shifter, because it's pretty much required in order to do floating-point addition.
  • moonshadow
    moonshadow about 12 years
    @Oli: but even if you could control it, it's not wired up to shift the whole float, just the mantissa... I shall clarify.
  • Oliver Charlesworth
    Oliver Charlesworth about 12 years
    It's ok, your answer is already fine. I was just being the stereotypical SO pedant!
  • Peter Cordes
    Peter Cordes almost 9 years
    On amd64, FP math is usually done in SSE registers. There's nothing stopping you from using integer left/right shifts on those registers. (Except for the fact that the results won't be useful for much of anything!)