20

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

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を使用して、PWM 信号を制御して姿勢を補正する位置値xを調整する必要があります。

4

9 に答える 9

21

最初のものはうまくいきます。100 は float に変換され、IEE754 は約 2 23までのすべての整数を float として正確に表すことができます。

2 番目のものも機能しますが、最初に整数に変換されるため、精度が失われます (浮動小数点数を整数に変換する場合、これは避けられません)。

于 2009-04-17T04:30:53.070 に答える
11

あなたは浮動小数点数の微妙な点に慣れていないので、David Goldberg によるこの素晴らしい論文を紹介します:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと( Sun で再掲)

あなたがそれで怖がっていた後、現実には、ほとんどの場合、浮動小数点は計算を完了するのに大きな恩恵をもたらします. また、最新のコンパイラと言語 (C を含む) は変換を適切に処理するため、変換について心配する必要はありません。あなたがしない限り。

精度について提起された点は確かに有効です。IEEE floatは実質的に24 ビットの精度しか持たず、これは 32 ビット整数よりも小さいです。中間計算にを使用すると、すべての丸めと精度の低下がまたはdoubleへの変換にプッシュされます。floatint

于 2009-04-17T07:28:33.860 に答える
8

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

動作が正しいかどうかを本当に知るには、まずプロモーションのルールを理解し、次にデータ型の表現を理解する必要があります。非常に一般的な言葉で:

  • 短い型は長い型に変換されます ( floatto doubleshorttointなど)。
  • 整数型は浮動小数点型に変換されます
  • 符号付き/符号なしの変換は、データ損失の回避に有利です (符号付きが符号なしに変換されるか、またはその逆かは、それぞれの型のサイズによって異なります)

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

于 2009-04-17T18:19:50.253 に答える
2

float と integer を比較できますか。しかし、遭遇する問題は精度です。ほとんどの C/C++ 実装では、float と int は同じサイズ (4 バイト) で、精度レベルが大きく異なります。どちらの型も、もう一方の型のすべての値を保持できません。精度を失うことなく 1 つの型を別の型に変換することはできず、型をネイティブに比較することもできないため、別の型を考慮せずに比較を行うと、一部のシナリオでは精度が失われます。

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

float f = getSomeFloat();
int i = getSomeInt();
if ( (double)i == (double)f ) { 
   ...
}
于 2009-04-17T05:49:46.487 に答える
1

はい、それらを比較できます。ほとんどの場合、どれがどれであるかをあまり気にせずに、それらを計算できます。しかし、ほとんどだけです。大きな問題は、 etc をチェックできるが、 をチェックしてf<iはならないということですf==i。値が同一である必要がある整数と浮動小数は、必ずしも同一ではありません。

于 2009-04-17T05:40:20.143 に答える
1

LHS は精度を定義するため、LHS が int で RHS が float の場合、精度が失われます。

FP関連のCFAQもご覧ください

于 2009-04-17T04:35:35.667 に答える
0

はい、場合によっては、まさに期待どおりの結果が得られることもあります。

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

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

于 2009-04-17T05:32:57.010 に答える
0

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

于 2009-04-17T04:26:43.067 に答える
0

それについては、表記 1.0 は double 型なので、前述のように型昇格規則によって double で比較が行われます。1.f または 1.0f は float 型であり、比較は float で行われます。最初の 2^23 の整数は float で表現できると言ったので、それも同様に機能します。

于 2010-10-28T08:41:22.647 に答える