Изменения оператора модуля - PullRequest
4 голосов
/ 29 августа 2010

$ 5.6 / 4 в состояниях C ++ 03 - «Если оба операнда неотрицательны, то остаток неотрицателен; если нет, знак остатка определяется реализацией 74) .

, где Примечание 74 равно

. В соответствии с проводимой работой по пересмотру ISO C предпочтительный алгоритм целочисленного деления следует правилам, определенным в стандарте ISO Fortran, ISO / IEC1539: 1991, в котором частное всегда округляется до нуля.

C ++ 0x состояния -

$ 5.6 / 4- "Для целых операндов оператор / даеталгебраическое частное с любой дробной частью отбрасывается; 79 , если частное a / b представимо в типе результата, (a/b)*b + a%b равно.

Примечание 79говорит

Это часто называют усечением до нуля.

Поэтому у меня два вопроса:

  • Может кто-нибудь объяснить эту концепцию'усечения до нуля'?

  • Является ли модуль с ппримерные операнды определенного поведения в C ++ 0x?

Ответы [ 3 ]

6 голосов
/ 29 августа 2010

Усечение до нуля означает преобразование действительного числа в целое число путем выбора следующего целого числа ближайшего нуля Эквивалентно, вы записываете число и игнорируете все после десятичной точки, будь то число положительное или отрицательное.

Рассмотрим 11/4 = 2,75 - если вы укоротите это значение до нуля, вы получите 2.

рассмотрите -11/4 или 11 / -4 = -2,75 - если вы укоротите это значение до нуля, вы получите -2. ​​

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

a == 11, b == 4:
a/b == 2, 2*4 + a%b == 11, therefore a%b == 3.

a == -11, b == 4:
a/b == -2, -2 * 4 + a%b == -11, therefore a%b == -3.

a == 11, b == -4:
a/b == -2, -2 * -4 + a%b == 11, therefore a%b == 3.

a == -11, b == -4:
a/b == 2, 2 * -4 + a%b == -11, therefore a%b == -3.

Поначалу это может сбивать с толку, но C ++ 0x определяет поведение оператора a%b, используя уравнение (a/b)*b + a%b == a. Это уравнение выполняется даже для отрицательных чисел, поэтому a%b определено для отрицательных чисел.

3 голосов
/ 29 августа 2010

а) Рассмотрим (±5)/(±3) -> ±1.В числовой строке:

  (-5)/3                                     5/3
     5/(-3)                               (-5)/(-3)
      =                                       =
    -1.66 --> -1                       1 <-- 1.66
       v       v                       v       v
-  +  -  -  -  +  -  -  -  +  -  -  -  +  -  -  -  +  -
   |           |           |           |           |
  -2          -1           0           1           2

округление, таким образом, в сторону ноль.

b) Да.Поскольку a/b теперь определено для всех a и b (кроме b == 0) и (a/b)*b + a%b == a, существует только 1 уникальное решение для a%b, поэтому оператор % также хорошо работаетдля всех a и b (кроме b == 0).

1 голос
/ 29 августа 2010

а) «Усечение до нуля» просто означает, что любая десятичная часть отсекается.Усеченное число всегда, по крайней мере, настолько близко к 0, как правило, и ближе к первоначальному номеру.

Это наиболее заметно в отрицательных числах, но цель состоит в том, чтобы сделать менее сложным использование / и % с отрицательными числами (поскольку в настоящее время любая реализация может обрабатывать это по своему усмотрению).-7/4 можно представить двумя способами: -2 с остатком 1 или -1 с остатком -3.И есть компиляторы и процессоры, которые справляются с этим обоими способами.Так как -7/4 на самом деле -1,75, «усечение до нуля» даст вам -1, так что последний способ - это то, что будет стандартным.

b) Вот как это выглядит.Он всегда был полуопределенным («определяемым реализацией»), но это похоже на попытку определить то, что должно было быть стандартным с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...