Как сделать операцию по модулю в Objective-C / Cocoa Touch?

82

У меня есть два значения CGFloat, и я хочу рассчитать результат по модулю. Или, другими словами: я хочу знать, что останется, если valueA поместить как можно больше в valueB.

Итак, я просто попробовал:

CGFloat moduloResult = valueB % valueA;

компилятор жалуется на% и говорит мне: «недопустимые операнды для двоичного%». Есть идеи?


источник

Ответы:

204

% для intили long, не floatилиdouble .

Вместо этого вы можете использовать fmod()или fmodf()from <math.h>.

Лучше, <tgmath.h>как предложил изобретатель CGFloat .

Mouviciel
источник
2
доступен ли tgmath.h на iphone? Интересно, потому что мне никогда не приходилось включать math.h. Думаю, он идет с базовой структурой.
Также в чем разница между tgmath.h и math.h?
user4951
4
Джим: tgmath.hявляется «универсальным типом» (отсюда и «tg») и, таким образом, решает, какую math.hфункцию вызывать, учитывая тип вашего ввода. (Например, вызов floor(x)с tgmath.hвключенным вызовом вызовет (из math.h), floorf(x)если xэто a float, floor(x)если xэто doubleили floorl(x)если xэто a long double.)
Джордж WS
10

Если я правильно помню, по модулю требуется 2 int в качестве ввода, поэтому вам понадобится что-то вроде:

CGFloat moduloResult = (float)((int)valueB % (int)valueA);

Предполагая, что valueB и valueA оба являются плавающими

Джеймс
источник
3
Это, конечно, не даст вам правильного ответа из-за округления.
fishinear 01