Wie mache ich eine Modulo-Operation in Objective-C / Cocoa Touch?

82

Ich habe zwei CGFloat-Werte und möchte das Modulo-Ergebnis berechnen. Oder mit anderen Worten: Ich möchte wissen, was noch übrig ist, wenn valueA so weit wie möglich in valueB platziert wird.

Also habe ich einfach versucht:

CGFloat moduloResult = valueB % valueA;

Der Compiler beschwert sich über% und sagt mir: "Ungültige Operanden zu binärem%". Irgendeine Idee?


quelle

Antworten:

203

% ist für intoder long, nicht floatoder double.

Sie können stattdessen fmod()oder fmodf()von <math.h>verwenden.

Besser ist, <tgmath.h>wie vom Erfinder von CGFloat vorgeschlagen .

Mouviciel
quelle
2
ist tgmath.h auf dem iphone verfügbar? Ich frage mich, weil ich math.h nie einbeziehen musste. Ich denke, es kommt mit dem Grundgerüst.
Was ist überhaupt der Unterschied zwischen tgmath.h und math.h?
user4951
4
Jim: tgmath.hist "type generic" (daher das "tg") und entscheidet daher, welche math.hFunktion angesichts des Typs Ihrer Eingabe aufgerufen werden soll. (Wenn Sie beispielsweise floor(x)mit tgmath.heingeschlossen anrufen, wird (von math.h) aufgerufen, floorf(x)wenn xa float, floor(x)if xa doubleoder floorl(x)if a xist long double.)
George WS
10

Wenn ich mich richtig erinnere, benötigt Modulo 2 Zoll als Eingabe, sodass Sie Folgendes benötigen:

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

Angenommen, valueB und valueA sind beide Floats

James
quelle
3
Dies gibt Ihnen aufgrund von Rundungen natürlich nicht die richtige Antwort.
fishinear