2012-02-16 5 views
6

左シフトフロート式

float_val=float_val<<1; 

をやろうとしているそれは、「エラーC2296: 『< <』:違法、左のオペランドが 『フロート』を入力した」というエラーが出ていますしながら、コンパイラのエラーを取得する

浮動小数点を左シフトできませんか?なぜこれはそうですか?

+1

浮動小数点の場合にどのくらい正確にシフトが行われると思いますか? – Tudor

+0

int(power of 2)と同じです – Akash

+0

浮動小数点の異なるビットは異なる意味を持っているので、浮動小数点のビットシフトを行うのは意味がありません –

答えて

13

float変数を左にシフトすることはできません。なぜなら、(a)FPUには一般にバレルシフタが公開されていないため、物理的にコードを生成することができず、(b)それはどういう意味ですか?基礎となるビット表現は、意味の異なる複数のフィールドで構成されていますが、実際にそれらのビットが互いに出血してもらいたいのですか?

その変数に保持されている数値に2を掛けたい場合は、代わりにその変数を代入するだけです。

浮動小数点数をCarmackの平方根のような恐ろしいビットハックのためにシフトを左にした型(例えば、適切に大きな符号なし整数型)で再解釈したいのであれば、ハードウェアの場合、本当に必要なことはほとんどありません。あなたが望むことを実行するためのよりよい方法があるか真剣に検討してください。

+3

+1。しかし、賢明であるためには、浮動小数点加算を行うためにはかなり必要なので、FPUはほぼ確実に*バレルシフタを持ちます。 –

+1

@Oli:あなたがそれを制御することができたとしても、フロート全体をシフトさせるために配線されていません。ちょうど仮数です...私は明確にします。 – moonshadow

+0

あなたの答えはすでに大丈夫です。私はちょうどステレオタイプのSOのパンダだった! –

1

浮動小数点数には値表現のレベルのビットがありません。そのため、ビット演算をビット表現に適用できません。

詳細については、this answerを参照してください。

-1

フロートを最初に別のものに変換する必要があります。次のようになります。

float f = 128; 
f = (float) (((int) f) << 1); 

さらに、fは256.0である必要があります。

これは明らかに、キャストが.4を削除するため、128.4から始めると問題になります。フロートを最初に使用したくないかもしれません。

1

シフティングフロートは、符号ビット、指数、および仮数の連結として表されているため意味がありません。シフト動作はビットシフトに関するものであるため、仮数から指数および/または符号ビットへのビットのシフトを意味する。

0

floatタイプのオブジェクトを左にシフトすることはできません。

Cでは、ビット単位のシフト演算子のオペランドは整数型でなければなりません。

1

左シフト演算子は2のべき乗の乗算として定義されているため、浮動小数点型には理にかなっています。しかし、C言語ではその使用法が定義されていないため、代わりにscalbn関数などを使用する必要があります。

4

浮動小数点数を2の累乗で素早く乗算または除算したい場合は、標準関数ldexpfを調べてください。明白に少しわかりにくいのは明らかです:-)。

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

関連する問題