web-dev-qa-db-ja.com

Cの整数に浮動小数点数を比較して追加できますか?

浮動小数点数を整数と比較できますか?

Floatはコード内の整数と比較されますか?

float f;     // f has a saved predetermined floating-point value to it  
if (f >=100){__asm__reset...etc}

また、私は...

float f;
int x = 100;
x+=f;

姿勢基準システムから受け取った浮動小数点値fを使用して位置値を調整する必要がありますx PWM信号を制御して姿勢を補正します。

19
sevenboarder

最初のものは問題なく動作します。 100はfloatに変換され、IEE754は最大約2までのすべての整数をfloatとまったく同じように表すことができます。23

2つ目も機能しますが、最初に整数に変換されるため、精度が低下します(floatを整数に変換する場合は避けられません)。

21
paxdiablo

浮動小数点数の微妙さに慣れていないことがわかったので、DavidGoldbergによるこのすばらしい論文を参照します。 すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと (- 再版 日曜日)。

あなたがそれを恐れた後、現実には、時間浮動小数点のmostは計算を行うための大きな恩恵です。また、最新のコンパイラと言語(Cを含む)は変換を適切に処理するため、変換について心配する必要はありません。そうしない限り。

精度に関して提起されたポイントは確かに有効です。 IEEE float は、実質的に24ビットの精度しかなく、32ビット整数よりも小さくなります。中間計算にdoubleを使用すると、すべての丸めと精度の損失がfloatまたはintへの変換にプッシュされます。

10
RBerteig

混合モード演算(異なるタイプやサイズのオペランド間の算術演算)は合法ですが、壊れやすいものです。 C標準では、オペランドを共通の表現に変換するための型昇格の規則が定義されています。自動型昇格により、コンパイラーは混合モード操作に適した処理を実行できますが、「適切」とは必ずしも「正しい」ことを意味するわけではありません。

動作が正しいかどうかを実際に知るには、最初にプロモーションのルールを理解してから、データ型の表現を理解する必要があります。 非常に一般的な用語:

  • 短いタイプは長いタイプに変換されます(floatからdoubleshortからintなど)
  • 整数型は浮動小数点型に変換されます
  • 符号付き/符号なしの変換は、データ損失の回避に役立ちます(符号付きが符号なしに変換されるか、またはその逆に変換されるかは、それぞれのタイプのサイズによって異なります)

x > yxyのタイプが異なる)のようなコードが正しいか間違っているかは、xyができる値によって異なります。取る。私の経験では、暗黙の型変換を(コーディング標準を介して)禁止するのが一般的な方法です。プログラマーはコンテキストを考慮し、必要な型変換を明示的に実行する必要があります。

8
Michael Carman

確かに、浮動小数点数と整数を比較できますか。しかし、あなたが遭遇する問題は精度です。ほとんどのC/C++実装では、floatとintのサイズは同じ(4バイト)で、精度レベルは大きく異なります。どちらのタイプも、他のタイプのすべての値を保持できるわけではありません。精度を損なうことなく一方の型を他方の型に変換することはできず、型をネイティブに比較することはできないため、別の型を考慮せずに比較を行うと、シナリオによっては精度が低下します。

精度の低下を回避するためにできることは、両方の型を、floatとintのすべての値を表すのに十分な精度を持つ型に変換することです。 mostシステムでは、doubleはまさにそれを行います。したがって、以下は通常、損失のない比較を行います

float f = getSomeFloat();
int i = getSomeInt();
if ( (double)i == (double)f ) { 
   ...
}
2
JaredPar

LHSは精度を定義するため、LHSがintでRHSがfloatの場合、精度が低下します。

FP関連 [〜#〜] cfaq [〜#〜] もご覧ください

1
Alphaneo

はい、あなたはそれらを比較することができます、あなたはそれらで数学をすることができます、ほとんどの場合、どれがどれであるかをひどく気にすることなく。しかし、ほとんどだけ。大きなバガブーは、f<iなどをチェックできますが、f==iはチェックしないでください。値が同一である必要がある整数と浮動小数点数は、必ずしも同一である必要はありません。

1
Kim Reece

はい、そして時々それはあなたが期待することを正確に行うでしょう。

他の人が指摘しているように、整数1は比較前にdoublefloatではなく)に型キャストされるため、たとえば1.0 == 1と比較するとうまくいきます。

ただし、他の比較ではそうではない場合があります。

0
Charlie Martin

それについては、1.0という表記はdouble型であるため、前述のように型プロモーションルールによってdouble型で比較されます。 1.fまたは1.0fはfloat型であり、比較はfloatで行われます。また、2 ^ 23個の最初の整数がfloatで表現可能であると述べたので、同様に機能します。

0
Lightness1024

ええ、それはうまくいくでしょう。具体的には、intは変換の目的でfloatに変換されます。 2つ目では、intにキャストする必要がありますが、それ以外の場合は問題ありません。

0
Promit