2013-07-14 3 views
2

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

ответ

0

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

17.0 * 0.33 = 5.61 

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

5.61 - 5 ----> 0.61 

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

0.61 * 3 ------> 1.83 

затем CEIL() это

2 ----> this is 17%3 

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

+0

Почему вы думаете, что это быстрее или лучше, чем 'a% b' каким-либо образом? – oseiskar

+0

Я сказал, «может быть», не скамейка. –

+0

Пример: 65536% 255 может составлять сотни циклов. Но здесь только функции пола и потолка занимают некоторое время. Другие - только умножения и вычитания. –

4

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

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

1

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