Jak wykonać operację modulo w Objective-C / Cocoa Touch?

82

Mam dwie wartości CGFloat i chcę obliczyć wynik modulo. Innymi słowy: chcę wiedzieć, co pozostanie, jeśli wartość A zostanie umieszczona jak najwięcej w valueB.

Więc właśnie spróbowałem:

CGFloat moduloResult = valueB % valueA;

kompilator narzeka na% i mówi mi: "nieprawidłowe operandy do binarnego%". Dowolny pomysł?


źródło

Odpowiedzi:

204

% jest dla intlub longnie floatlub double.

Zamiast tego możesz użyć fmod()lub fmodf()z <math.h>.

Lepiej jest, <tgmath.h>jak sugeruje wynalazca CGFloat .

mouviciel
źródło
2
czy tgmath.h jest dostępny na iPhone? Zastanawiam się, ponieważ nigdy nie musiałem uwzględniać matematyki. H. Myślę, że chodzi o ramy fundamentowe.
Jaka jest różnica między tgmath.h i math.h w ogóle?
user4951
4
Jim: tgmath.hjest „typem generycznym” (stąd „tg”) i dlatego zdecyduje, którą math.hfunkcję wywołać, biorąc pod uwagę typ wprowadzonych danych. (Na przykład wywołanie floor(x)z tgmath.hzawartością wywoła (from math.h) floorf(x)if xto a float, floor(x)if xis a double, or floorl(x)if xis a long double.)
George WS
10

Jeśli dobrze pamiętam, modulo wymaga 2 intów jako wejścia, więc potrzebujesz czegoś takiego:

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

Zakładając, że wartość B i wartość A są zmiennoprzecinkami

James
źródło
3
To oczywiście nie da poprawnej odpowiedzi ze względu na zaokrąglenia.
fishinear