-1

整数値に 2^31 を掛ける必要があります。私はそれをグーグルで調べましたが、倍精度の範囲は 2.23e-308 <= |X| のようです。<= 1.79e308 (64 ビットを使用する場合)、および 1.18e-38 <= |X| の間の浮動小数点数 <= 3.40e38。

それは私が必要とする以上のものです。しかし、うまくいきません。

ヘッダー ファイルに次の定数値があります。

static const float SCALE_FACTOR = 2^-31;

そして、もし私がするなら:

float dummy = SCALE_FACTOR;

この場合、ダミーの値は 11 です。

問題がそのような定数値を割り当てているかどうかはわかりませんが、精度を失うことなくそれを書く方法が他にわかりません。

何か助けはありますか?

編集:申し訳ありませんが、ばかげた質問です。私の MatLab のバックグラウンドは私を裏切り、^ は C++ のべき乗ではないことを忘れていました。私は閉鎖に投票しました。

4

4 に答える 4

4

^ は C++ のビットごとの xor 演算子であり、指数演算子ではありません。いくつかの選択肢があります。

  1. 定数を本質的に損失のある形式 a で格納しているためfloat、基数 10 のe形式リテラルを作成してそれを使用できます。おそらく4.6566128730773926e-0102^-31 のようなものです。これはエラーが発生しやすく (たとえば、私が作成したことがあります)、浮動小数点形式間で移植性があるとは限りません。
  2. コンパイル時に評価できる定数式を使用して定数を設定し、整数リテラルを使用できます。たとえば、2 ^31 または2^-31 のいずれ0x80000000かです。1UL << 311.0f / 0x80000000

powもちろん、何らかの関数を使用して実行時に値を計算することもできます。

long longちなみに、整数を使用している場合は、丸め誤差が発生する可能性がある浮動小数点の代わりに、またはその他の 64 ビット整数型を使用しないのはなぜですか? 浮動小数点値の範囲が必要なために浮動小数点値を見ているのか、それとも単に 32 ビット整数値のオーバーフローが心配なのか、質問からは完全には明らかではありません。

于 2012-11-14T12:38:04.170 に答える
1

あなたのコードで

static const float SCALE_FACTOR = 2^-31;

これは不要でありstatic(定数はデフォルトで内部リンケージを持っています)、^はビット単位のXORを示し、-意味がなく(少なくとも、前述のように「2 ^ 31を掛ける」場合)、floatデフォルトとは対照的に、不必要に特別な選択です。浮動小数点型double(たとえば、などの浮動小数点リテラルの型3.14)。

また、C ++では、マクロのすべての大文字の識別子を叫ぶことを予約します(一般的な規則)。それらを定数に使用するのはJava主義です。皮肉なことに、Javaの慣習はCに端を発し、過去の定数をマクロとして表現する必要がありました。

代わりに、したがって、

double const scale_factor = 1uL << 31;

どこ

  • static内部リンケージ(キーワード)を明示的に指定していない、

  • doubleの代わりにデフォルトの浮動小数点型を使用しますfloat

  • ALL UPPERCASE ID(マクロ用に予約する必要があります)を使用していない、

  • 誤ったものではなく、左ビットシフトを使用して<<2の累乗を計算します^

  • 意味のないマイナス記号を追加しない、

  • タイプunsigned long(で指定uL)を使用して、十分な範囲を確保してください。

于 2012-11-14T12:50:39.100 に答える
0

2 の累乗を掛けることは、その累乗だけ左にシフトすることと同じです。整数を 2 倍して 31 にするには、単純にシフトします。

unsigned long value = whatever;
unsigned long value_times_2_to_the_31 = value << 31;

ここでは浮動小数点演算は必要ありません。ただし、完全を期すために、2 から 31 までの double 値を生成するには、次のようにします。

double two_to_the_31 = std::ldexp(1.0, 31);

符号付き型のシフト式の結果は、場合によっては形式的に未定義になりますが、整数型のオーバーフローが原因であることに注意してください。代わりに浮動小数点演算を使用しても、オーバーフローは解消されず、コードの別の部分に配置されるだけです。

于 2012-11-14T13:30:41.563 に答える
0

^累乗ではなく、ビットごとの XOR の演算子です。が必要std::pow()です。

于 2012-11-14T12:37:05.873 に答える