2009-03-18 9 views
1

Ich versuche, den Modulo-Operator (%) auf lange longs zu verwenden, und es scheint 0 zurückzugeben, wenn die Zahl über dem Bereich eines unsigned int ist. Gibt es einen Operator oder eine Funktion, die ich stattdessen verwenden sollte, oder sollte ich meine eigenen rollen?Modulo mit langen langen ganzen Zahlen in Objective C

- Update: vor für den Mangel an Beispiel-Code sorry, ich war in Eile, die Tür aufmachen -

Hier ist der Code:

long long val = 12345678991245; // always less than LLONG_MAX 
int power = 0; 
NSMutableArray *powers = [[NSMutableArray alloc] init]; 
while (pow(10, power) <= val) { 
    tVal = (val % (lround(pow(10, power + 1))))/lround(pow(10, power)); 
    [powers addObject:[NSNumber numberWithInt:tVal]]; 
    NSLog(@"Power: %d tVal: %d", power, tVal); 
    val -= val % lround(pow(10, power + 1)); 
    power++; 
} 

Wenn Sie am Ausgang aussehen gemacht von dieser NSLog Aussage, Sie dies aber sehen, wenn die Zahl UINT_MAX übersteigt (für die Nummer 1,111,111,111,111):

2009-03-18 20:42:16.471 Numbers[11197:20b] Power: 0 tVal: 1 
2009-03-18 20:42:16.472 Numbers[11197:20b] Power: 1 tVal: 1 
2009-03-18 20:42:16.473 Numbers[11197:20b] Power: 2 tVal: 1 
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 3 tVal: 1 
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 4 tVal: 1 
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 5 tVal: 1 
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 6 tVal: 1 
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 7 tVal: 1 
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 8 tVal: 1 
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 9 tVal: 0 
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 10 tVal: 0 
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 11 tVal: 0 
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 12 tVal: 0 

Alles ist koscher bis Sie kommen bis zu UINT_MAX, dann gibt es nur 0.

Ich kompiliere gegen das iPhone SDK mit Xcode 3.1.2.

Irgendwelche Ideen?

+0

Bitte seien Sie spezifischer (zeigen Sie Code, welches Argument/Ergebnis ist über int-Bereich, was ist Ihr Compiler/Plattform ...). In jedem Fall würde ich vermuten, dass es sich um einen Compiler Bug handelt. – starblue

+0

"Es scheint"? Ich bin kein ObjC-Guru, aber ich denke, das Problem mit einem Code zu demonstrieren wäre großartig. Vielleicht haben Sie ein Problem mit dem "Es scheint" -Teil, da ich nirgends Bezugnahmen auf Modulgrenzen finden konnte. – DevSolar

Antwort

4

lround gibt eine lange zurück, die 32 Bits hat. Versuchen Sie stattdessen llround.

Besser noch, verwenden Sie nicht Fließkomma, um Integer-Mathe zu tun. Da Sie den Exponenten jedes Mal durch die Schleife um eins erhöhen, müssen Sie die Leistung nicht jedes Mal berechnen. Speichern Sie es einfach in einer Variablen und multiplizieren Sie es bei jeder Iteration mit 10.

Auch statt die Zahl durch größere und größere Zehnerpotenzen zu teilen, versuchen Sie, die Zahl jedes Mal durch zehn zu teilen.

Wenn Sie nach einem Fehler suchen, brechen Sie den Code in kleinere Schritte und überprüfen Sie die Ergebnisse der Zwischenoperationen.