C ++ определенность целочисленного деления с остатком

У меня есть вопрос о выполнении деления с остатком целых чисел в C / C ++. Говорят, что при делении между двумя целыми числами, если результат не может быть выражен как целое число, его часть, которая не является целым числом, удаляется в десятичном виде.
Например, int a = 17; а / = 3; /pseudo float a, получает значение 5.6666 ../ поэтому результат равен 5. Это результат нормального деления с остатком в арифметике одновременно из-за части после точки (6666 ..), которая фактически является делением остатка (2) на 3.
Это работает на моем компьютере, но это определенно надежно, или я должен объявить с помощью float, а затем привести к int с floor для безопасности? Что лучше для исполнения и безопасно?
Заранее спасибо.

2

Решение

Арифметическая операция над целыми числами в C ++ не зависит от компьютера.
Если a а также b целые числа, a / b всегда даст вам целое число деления и a % b всегда даст вам остаток от целочисленного деления.

С точки зрения производительности, вы можете взглянуть на этот вопрос StackOverflow, но это, кажется, зависит от архитектуры.

4

Другие решения

Вы должны использовать a / b а также a % b для целочисленного деления и остатка. Как говорит Леванс, они гарантированно предоставят вам «правильные» значения независимо от вашего оборудования (по крайней мере, если a а также b положительны). При использовании арифметики с плавающей запятой на результат могут влиять ошибки округления, которые также могут зависеть от аппаратного обеспечения.

1

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

17.0 * 0.33 = 5.61

затем floor () в целое число и вычтите:

5.61 - 5 ----> 0.61

затем умножьте результат с обратным 0,33:

0.61 * 3 ------> 1.83

тогда ceil () это

2    ----> this is 17%3

Это в 14 раз медленнее, чем при использовании прямого модуля, согласно бенчмаркингу пользователя «Oseiskar».

0
По вопросам рекламы [email protected]