2009-03-18 16 views
1

J'essaie d'utiliser l'opérateur modulo (%) sur des longs longs, et il semble retourner 0 si le nombre est au-dessus de la plage d'un entier non signé. Y a-t-il un opérateur ou une fonction que je devrais utiliser à la place ou dois-je lancer le mien?Modulo avec longs entiers longs dans Objective C

- Mise à jour: désolé pour le manque de code exemple avant, j'étais pressé, de sortir la porte -

Voici le 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++; 
} 

Quand vous regardez la sortie faite par cette déclaration NSLog, bien que, vous voyez quand le nombre dépasse UINT_MAX (pour le nombre 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 

Tout est casher jusqu'à vous obtenez jusqu'à UINT_MAX passé, alors il renvoie juste 0.

Je compile contre le SDK de l'iPhone en utilisant Xcode 3.1.2.

Des idées?

+0

Svp être plus spécifique (montrer le code, quel argument/résultat est au-dessus de la gamme int, quel est votre compilateur/plate-forme ...). En tout cas, je suppose que c'est un bug du compilateur. – starblue

+0

"Il semble"? N'étant pas un gourou ObjC, mais je pense que démontrer le problème avec un morceau de code serait génial. Peut-être avez-vous un problème avec la partie "ça semble", puisque je n'ai pas trouvé de références aux limites de module ailleurs. – DevSolar

Répondre

4

lround renvoie un long, qui a 32 bits. Essayez plutôt llround.

Mieux encore, n'utilisez pas de virgule flottante pour effectuer des calculs entiers. Puisque vous augmentez l'exposant de un chaque fois à travers la boucle, vous n'avez pas besoin de calculer la puissance à chaque fois. Il suffit de le stocker dans une variable et de le multiplier par 10 à chaque itération.

De plus, au lieu de diviser le nombre par des puissances plus grandes et plus grandes de dix, essayez de diviser le nombre par dix à chaque fois.

Lorsque vous recherchez un bogue, divisez le code en étapes plus petites et vérifiez les résultats des opérations intermédiaires.