Оператор по модулю в Objective C возвращает неправильный результат

Я немного волнуюсь результатами, которые я получаю, когда я делаю арифметику по модулю в Objective C.-1% 3 выходят, чтобы быть-1, который не является правильным ответом: согласно моему пониманию, это должно быть 2.-2% 3 выходят к-2, который также не является правильным: это должно быть 1.

Есть ли другой метод, который я должен использовать помимо оператора % для получения корректного результата?

9
задан Greg Maletic 12 March 2010 в 05:44
поделиться

3 ответа

По модулю с отрицательными числами не так просто, как вы могли бы подумать. См. http://mathforum.org/library/drmath/view/52343.html

1
ответ дан 4 December 2019 в 14:28
поделиться

Objective-C является супермножеством C99, а C99 определяет a % b как отрицательное, если a отрицательно. См. также статью Википедии об операции Modulo и этот вопрос на StackOverflow.

Что-то вроде (a >= 0) ? (a % b) : ((a % b) + b) (который не был протестирован и, вероятно, содержит ненужные круглые скобки) должен дать вам нужный результат.

7
ответ дан 4 December 2019 в 14:28
поделиться

ANSI C99 6.5.5 Мультипликативные операторы -

6.5.5.5: Результатом оператора / является частное от деления первого операнда на второй; результат оператора % - остаток. В обеих операциях, если значение второго операнда равно нулю, поведение не определено.

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

* 90: Это часто называют «усечением до нуля».

Тип поведения по модулю, о котором вы думаете, называется «модульной арифметикой» или стилем «теории чисел» по модулю / остатку. Используя определение оператора по модулю модульной арифметики / теории чисел, бессмысленно иметь отрицательный результат. Это (очевидно) не стиль поведения по модулю, определенный и используемый C99. В способе C99 нет ничего «неправильного», это просто не то, чего вы ожидали. :)

2
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: