例えば、
int result;
result = 125/100;
または
result = 43/100;
結果は常に部門のフロアになりますか?定義された動作とは何ですか?
"I just throw the dam fraction part in the trash and move on with life"
例えば、
int result;
result = 125/100;
または
result = 43/100;
結果は常に部門のフロアになりますか?定義された動作とは何ですか?
"I just throw the dam fraction part in the trash and move on with life"
回答:
結果は常に部門のフロアになりますか?定義された動作とは何ですか?
はい、2つのオペランドの整数の商。
6.5.5乗法演算子
6整数を除算すると、/演算子の結果は、小数部分が破棄された代数商になります。88)商a / bが表現可能な場合、式(a / b)* b + a%bはaに等しくなります。
および対応する脚注:
88)これはしばしば「ゼロへの切り捨て」と呼ばれます。
もちろん、注意すべき点が2つあります。
3通常の算術変換は、オペランドに対して実行されます。
そして:
5 /演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。%演算子の結果が余りです。どちらの演算でも、第2オペランドの値がゼロの場合の動作は未定義です。
[注:強調鉱山]
(a / b) * b + a % b == a
満足する必要があり、の絶対値はa % b
未満である必要がありましたが、負が負であるa
か、指定されていませんでした。a % b
a
b
ダークジェントは素晴らしい説明をしますC99の整数除算、をますが、C89では、負のオペランドを使用した整数除算には実装定義の方向があることも知っておく必要があります。
ANSI Cドラフト(3.3.5)から:
いずれかのオペランドが負の場合、/演算子の結果が代数商よりも小さい最大の整数であるか、代数商よりも大きい最小の整数であるかは、%演算子の結果の符号と同様に、実装によって定義されます。商a / bが表現可能な場合、式(a / b)* b + a%bはaに等しくなります。
したがって、C89コンパイラーに悩まされている場合は、負の数に注意してください。
C99がゼロへの切り捨てを選択したのは面白い事実です。なぜなら、それがFORTRANがそれを行った方法だからです。comp.std.cでこのメッセージを参照してください。
reliable integer division
、新しい言語機能として言及しています。アメージング*-*
。
expr1 / expr2
と規格が言うべきでしたが、それ以外の場合、切り捨てとフロア分割の選択は指定されていません。これにより、互換性を大幅に損なうことなく、より効率的なコード生成が可能になります(実装によっては、傾斜した場合、特定の動作を文書化できます)expr1 % expr2
expr1
expr2
結果が負の場合、Cはフローリングではなく0に切り捨てます。Python整数除算が常にここでフローリングする理由について、この読みを学びました:なぜPythonの整数除算フロア
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
、の値を変更して反復value
。時定数のある1次ローパスフィルターに適切な整数近似を行いk
ますが、除算が切り捨てられcarry
て負の値が取得される場合にのみ対称になります。分割の両方の動作は時々役立ちます。
div
床の除算演算子であり、factor
奇数である、そしてfiltered += (filter+(factor div 2)) div factor
までのすべての値の清潔で対称的行動をもたらすであろうINT_MAX-(factor div 2)
。
はい、結果は常にゼロに向かって切り捨てられます。絶対値が最小になるように丸めます。
-5 / 2 = -2
5 / 2 = 2
符号なしおよび負でない符号付き値の場合、これはfloorと同じです(-Infinityに丸めます)。
結果は常に部門のフロアになりますか?
いいえ。結果は異なりますが、変動は負の値に対してのみ発生します。
定義された動作とは何ですか?
明確にするために、整数除算はゼロに向かって丸めます(切り捨て)間、負の無限大に向かって丸めます
正の値の場合、それらは同じです
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
負の値の場合、これは異なります
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0