これらの間に違いはありますか?
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
私が理解しているように、どちらの場合も同じ結果になります。コンパイルされたコードに違いはありますか?
#include<cmath>
利用くださいstd::floor
)
bar
何ですか?
これらの間に違いはありますか?
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
私が理解しているように、どちらの場合も同じ結果になります。コンパイルされたコードに違いはありますか?
#include<cmath>
利用くださいstd::floor
)
bar
何ですか?
回答:
intにキャストすると、ゼロに向かって切り捨てられます。 floor()
負の無限大に切り捨てられます。bar
負の場合、これにより異なる値が得られます。
floor()
は、意図である場合、の値bar
が大きすぎてに収まらない場合int
です。
前に述べたように、正の数の場合は同じですが、負の数の場合は異なります。ルールでは、intは0に向かって丸められ、floorは負の無限大に向かって丸められます。
floor(4.5) = (int)4.5 = 4
floor(-4.5) = -5
(int)(-4.5) = -4
とはいえ、実行時間にも違いがあります。私のシステムでは、キャストがフロアの3倍以上高速になるように時間を計測しました。
負の数を含む限られた範囲の値のフロア操作を必要とするコードがあります。そして、それは非常に効率的である必要があるため、次の関数を使用します。
int int_floor(double x)
{
return (int)(x+100000) - 100000;
}
もちろん、これはxの非常に大きな値(いくつかのオーバーフローの問題が発生します)や-100000未満の負の値の場合などには失敗します。私たちのアプリケーションのために。細かい塩でそれを取り、あなたのシステムでそれをテストする、などですが、私見を検討する価値があります。
float
していますが、使用していません。double
おそらくdouble
アプリケーションでした。Cの場合は、必ずs と併用floorf()
してくださいfloat
。
SO 101、他の人があなたの質問に返信した後で質問を変更せず、代わりに新しい質問を書いてください。
なぜ同じ結果になると思いますか?
float foo = (int)(bar / 3.0) //will create an integer then assign it to a float
float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division
bar = 1.0
foo1 = 0;
foo2 = 0.33333...
fabs
ですか?質問についてfloor
です。0.33333
... の床はです0
。
編集:間の混乱のために質問が変更された可能性があるため fabs()
とのfloor()
です。
元の質問の例の行を考えると:
1. float foo = (int)(bar / 3.0);
2. float foo = fabs(bar / 3.0);
違いは、barが負の場合、最初の結果は負、2番目の結果は正になります。1つ目は整数に切り捨てられ、2つ目は小数部を含む完全な10進数値を返します。
主な違いは2つあります。
他の人が指摘したように、整数にキャストするとゼロに向かって切り捨てられますが、floor()
常に負の無限大に切り捨てられます。これは、負のオペランドに対する異なる動作です。
まだ(まだ)別の違いを指摘していないようです-引数が以上MAX_INT+1
(または未満-MAX_INT-1
)の場合、にキャストするint
と、最上位ビットが削除される(おそらくC)または未定義の動作( C ++および場合によってはC)。たとえば、int
32ビットの場合、符号ビットと31ビットのデータしかありません。したがってdouble
、サイズの大きいa でこれを使用すると、意図しない結果が生成されます。
int
オーバーフローへの変換の正確な条件は、引数がINT_MAX
+1 以上であることです。対称的に、アンダーフローの条件は、引数がINT_MIN
-1以下であることです。
(int) x
の整数部分を保持する要求です x
(ここでは丸めはありません)。
fabs(x)
= | x | ですので>= 0
、
例:を(int) -3.5
返します-3
。fabs(-3.5)
返す3.5
;
一般に
fabs (x) >= x
、すべてのxに対して。
x >= (int) x
もし x >= 0
x < (int) x
もし x < 0
floor
、これはのためでdouble
はないことに注意してくださいfloat
。C99はも持っfloorf
ていfloat
ます。