実行しようとすると、コンパイラエラーが発生します
float_val=float_val<<1;
「エラーC2296:'<<':不正です。左のオペランドのタイプは'float'です」というエラーが表示されます。
フロート変数を左シフトできませんか?なんでそうなの?
実行しようとすると、コンパイラエラーが発生します
float_val=float_val<<1;
「エラーC2296:'<<':不正です。左のオペランドのタイプは'float'です」というエラーが表示されます。
フロート変数を左シフトできませんか?なんでそうなの?
float
(a)FPUには通常バレルシフタが露出していないため、物理的にそれを行うためのコードを生成できないため、シフト変数を残すことはできません。(b)それはどういう意味ですか?基になるビット表現は、異なる意味を持つ複数のフィールドで構成されていますが、これらのビットが互いに混ざり合っていることを本当に望んでいますか?
その変数に保持されている数に2を掛けたい場合は、代わりにそれを行う必要があります。
カーマックの平方根のような恐ろしいビットハックのために、左シフトが意味をなすタイプ(たとえば、適切に大きい符号なし整数タイプ)としてフロートを再解釈したい場合は、それも可能ですが、最近のハードウェアでは非常にあなたが本当にする必要がある可能性は低いです:あなたが望むことをするためのより良い方法があるかどうか真剣に考えてください。
フロートを2の累乗ですばやく乗算または除算したい場合は、標準関数ldexpfを確認してください:-)。
浮動小数点数のシフトは、符号ビット、指数、仮数の連結として表されるため、意味がありません。シフト演算はビットのシフトに関するものであるため、ビットを仮数から指数にシフトしたり、ビットに符号を付けたりすることを意味します。
浮動小数点数には、値表現のレベルのビットがありません。そのため、浮動小数点数にビット単位の演算を適用することはできません。
詳細については、この回答を参照してください。
左シフト演算子は2の累乗による乗算として定義されているため、浮動小数点型には完全に理にかなっています。ただし、C言語ではその使用法が定義されていないため、代わりにscalbn
関数などを使用する必要があります。
float
タイプのオブジェクトを左シフトすることはできません。
Cは、ビット単位のシフト演算子のオペランドは整数型でなければならないと言います。
最初にフロートを別のものに変換する必要があります。そのような:
float f = 128;
f = (float) (((int) f) << 1 );
上記では、fは256.0である必要があります。
キャストが.4をドロップするため、128.4から始める場合は、明らかにこれは問題があります。そもそもフロートを使いたくないかもしれません。