7

実行しようとすると、コンパイラエラーが発生します

float_val=float_val<<1;

「エラーC2296:'<<':不正です。左のオペランドのタイプは'float'です」というエラーが表示されます。

フロート変数を左シフトできませんか?なんでそうなの?

4

7 に答える 7

18

float(a)FPUには通常バレルシフタが露出していないため、物理的にそれを行うためのコードを生成できないため、シフト変数を残すことはできません。(b)それはどういう意味ですか?基になるビット表現は、異なる意味を持つ複数のフィールドで構成されていますが、これらのビットが互いに混ざり合っていることを本当に望んでいますか?

その変数に保持されている数に2を掛けたい場合は、代わりにそれを行う必要があります。

カーマックの平方根のような恐ろしいビットハックのために、左シフトが意味をなすタイプ(たとえば、適切に大きい符号なし整数タイプ)としてフロートを再解釈したい場合は、それも可能ですが、最近のハードウェアでは非常にあなたが本当にする必要がある可能性は低いです:あなたが望むことをするためのより良い方法があるかどうか真剣に考えてください。

于 2012-02-16T17:05:59.650 に答える
5

フロートを2の累乗ですばやく乗算または除算したい場合は、標準関数ldexpfを確認してください:-)。

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

于 2016-12-12T19:33:32.250 に答える
2

浮動小数点数のシフトは、符号ビット、指数、仮数の連結として表されるため、意味がありません。シフト演算はビットのシフトに関するものであるため、ビットを仮数から指数にシフトしたり、ビットに符号を付けたりすることを意味します。

于 2012-02-16T17:08:58.277 に答える
1

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

詳細については、この回答を参照してください。

于 2012-02-16T17:04:20.537 に答える
1

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

于 2012-02-16T17:30:15.390 に答える
0

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

Cは、ビット単位のシフト演算子のオペランドは整数型でなければならないと言います。

于 2012-02-16T17:11:31.970 に答える
-2

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

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

上記では、fは256.0である必要があります。

キャストが.4をドロップするため、128.4から始める場合は、明らかにこれは問題があります。そもそもフロートを使いたくないかもしれません。

于 2012-02-16T17:07:46.463 に答える