2010-08-28 21 views

Répondre

3

Utilisez la fonction fmod() au lieu de %. Il accepte les paramètres double et renvoie un résultat double.

3

Pourquoi ne pas prendre la parole en premier, puis mod, par exemple. floor(e) % 100000? Peut-être que j'ai mal compris ce que vous essayez d'atteindre. Pourriez-vous donner un exemple de l'entrée et la sortie que vous attendez?

+0

Je suis en train de convertir un est et un nord en mètres avec un énorme nombre décimal (converti à partir d'un lat/long) en mètres, puis en le formatant. –

+0

Cela devrait être plus ou moins équivalent à toute autre solution ici. –

+0

Cela ne fonctionne que tant que le résultat de 'floor' correspond à un type entier. Pour les nombres à virgule flottante extrêmement volumineux, vous avez besoin de 'fmod' (et vous devez espérer qu'il est implémenté d'une manière précise pour les nombres énormes), mais si vous utilisez' fmod' avec de grands nombres, vous utilisez probablement le point flottant de rencontrer des bogues de perte de précision. –

0

Vous pouvez utiliser la division pour faire l'équivalent de modulo:

double e = 1289401004400.589201; 
const double divisor = 100000.0; 
double remainder = e - floor(e/divisor) * divisor; 
double result = floor(remainder); 
printf("%f\n", result); 

Imprime

4400,000000

Bien sûr, cela est beaucoup plus lent que tout modulo intégré ...

Vous pouvez également utiliser fmod, comme suggéré Anders K. :)

Modifier

fixe std :: cout (C++) de référence à utiliser printf (C). Correction du changement à la sortie. Maintenant, c'est purement C.

+1

-1 pour 'cout' dans une question étiquetée C qui dit même C dans le sujet. C n'est pas C++. –