Целочисленное деление в Си.

Ivan8209

Какое используется соглашение о знаках частного и остатка?
Симметричное или округлённое вниз?
Какой смысл находить остаток через "x - (x/y)*x"?
---
...Я работаю антинаучным аферистом...

rid2000

x%y

Ivan8209

Я это знаю.
Вопрос стоит именно так, как написано выше.
---
...Я работаю антинаучным аферистом...

rid2000

Давно уже на Си не писал...
Но по памяти, вроди, округление вниз...

rid2000

Можно же прогу накатать и проверить... это же не сложно...

Ivan8209

Дело в том, что это может различаться от компилятора к компилятору или от процессора к процессору.
Если это, конечно, не прописано жёстко в какой-нибудь бумажке.
---
...Я работаю антинаучным аферистом...

yolki

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]

Ivan8209

То есть, переводя на русский, "ничего не знаем, делайте как умеете,
но если хотите больше определённости, считайте, что частное округляется к нулю."
(Кстати, в этом случае знак остатка равен знаку делимого.)
Вообще, меня насильники удивляют:
(x - (x/y)*y) даёт жуткий проигрыш как в скорости, так и в написании программы.
На кой чёрт так надо, никто не знает.
---
...Я работаю антинаучным аферистом...

yolki

стандарт гарантирует, что выполнялется след. условие:
(a/b)*b + a%b = a
А каким макаром компилятор будет a%b вычислять и в какую сторону деление округлять - его проблемы.
Кстати, это равенство утверждает, что нет никакой разницы, как ты будешь вычислять - a%b или (a-(a/b)*b).
т.е. знак остатка и округление при делении - вещи взаимосвяанные.

Ivan8209

> А каким макаром компилятор будет a%b вычислять
> и в какую сторону деление округлять - его проблемы.
Дело в том, что это вносит кучу трудностей при программировании.
> Кстати, это равенство утверждает, что нет никакой разницы,
> как ты будешь вычислять - a%b или (a-(a/b)*b).
Первое --- быстрее, и даже очевидно почему.
> т.е. знак остатка и округление при делении - вещи взаимосвяанные.
Это давно известно.
Наш "анти-стандарт" определяет два деления:
"симметричное" (округление частного к нулю, знак остатка равен знаку делимого)
и "с округлением вниз" (знак остатка равен знаку делителя).
---
...Я работаю антинаучным аферистом...

yolki

Как бы ты не исхитрялся, но на одном и том же компиляторе, если он претендует на то, чтобы называться компилятором языка С++ стандарта такого-то, у тебя будут получаться одинаковые значения:
что считать a%b (как бы криво ни была определена операция %)
что считать a-(a/b)*b (из-за того, что деление будет округлено в согласии с %)
(это гарантирует стандарт)
если тебе так уж хочется считать по нашему (? - это чей стандарт? это определение в алгебре имеется в виду чтоли?) стандарту - придётся свою функцию писать.

Ivan8209

Форт от ANSI.
---
Я слышу сеть: ping <IP> | sed -ne '/=/s/.*=.*/^G/p'

sergey_m

Я слышу сеть: ping <IP> | sed -ne '/=/s/.*=.*/^G/p'
И все потому, что в Linux в ping нету "-a".

Ivan8209



bash-2.05b# uname -mrs
FreeBSD 5.2.1-RELEASE i386


Просто лень было читать man.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Имя или ник:
Комментарий: