Целочисленное деление в Си.
x%y
Вопрос стоит именно так, как написано выше.
---
...Я работаю антинаучным аферистом...
Но по памяти, вроди, округление вниз...
Можно же прогу накатать и проверить... это же не сложно...
Если это, конечно, не прописано жёстко в какой-нибудь бумажке.
---
...Я работаю антинаучным аферистом...
5.6 - Multiplicative operators [expr.mul]
-1- The multiplicative operators *, /, and % group left-to-right.
multiplicative-expression:
pm-expression
multiplicative-expression * pm-expression
multiplicative-expression / pm-expression
multiplicative-expression % pm-expression
-2- The operands of * and / shall have arithmetic or enumeration type; the operands of % shall have integral or enumeration type. The usual arithmetic conversions are performed on the operands and determine the type of the result.
-3- The binary * operator indicates multiplication.
-4- The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined*.
[Footnote: According to work underway toward the revision of ISO C, the preferred algorithm for integer division follows the rules defined in the ISO Fortran standard, ISO/IEC 1539:1991, in which the quotient is always rounded toward zero. --- end foonote]
но если хотите больше определённости, считайте, что частное округляется к нулю."
(Кстати, в этом случае знак остатка равен знаку делимого.)
Вообще, меня насильники удивляют:
(x - (x/y)*y) даёт жуткий проигрыш как в скорости, так и в написании программы.
На кой чёрт так надо, никто не знает.
---
...Я работаю антинаучным аферистом...
(a/b)*b + a%b = a
А каким макаром компилятор будет a%b вычислять и в какую сторону деление округлять - его проблемы.
Кстати, это равенство утверждает, что нет никакой разницы, как ты будешь вычислять - a%b или (a-(a/b)*b).
т.е. знак остатка и округление при делении - вещи взаимосвяанные.
> и в какую сторону деление округлять - его проблемы.
Дело в том, что это вносит кучу трудностей при программировании.
> Кстати, это равенство утверждает, что нет никакой разницы,
> как ты будешь вычислять - a%b или (a-(a/b)*b).
Первое --- быстрее, и даже очевидно почему.
> т.е. знак остатка и округление при делении - вещи взаимосвяанные.
Это давно известно.
Наш "анти-стандарт" определяет два деления:
"симметричное" (округление частного к нулю, знак остатка равен знаку делимого)
и "с округлением вниз" (знак остатка равен знаку делителя).
---
...Я работаю антинаучным аферистом...
что считать a%b (как бы криво ни была определена операция %)
что считать a-(a/b)*b (из-за того, что деление будет округлено в согласии с %)
(это гарантирует стандарт)
если тебе так уж хочется считать по нашему (? - это чей стандарт? это определение в алгебре имеется в виду чтоли?) стандарту - придётся свою функцию писать.
---
Я слышу сеть: ping <IP> | sed -ne '/=/s/.*=.*/^G/p'
Я слышу сеть: ping <IP> | sed -ne '/=/s/.*=.*/^G/p'И все потому, что в Linux в ping нету "-a".
bash-2.05b# uname -mrs
FreeBSD 5.2.1-RELEASE i386
Просто лень было читать man.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Ivan8209
Какое используется соглашение о знаках частного и остатка?Симметричное или округлённое вниз?
Какой смысл находить остаток через "x - (x/y)*x"?
---
...Я работаю антинаучным аферистом...