3

Étant donné que 8-byte doubles can represent all 4-byte ints precisely, je me demande si diviser un double A stockant un int, par un double B stockant un int (tel que l'entier B divise A) donne toujours le double exact correspondant à l'entier qui est leur quotient? Donc, si B et C sont des nombres entiers, et B * C s'intègre dans un int 32 bits, est-il garanti queDivision précise des doubles représentant exactement les entiers (quand ils sont divisibles)

int B,C = whatever s.t. B*C does not overflow 32-bit int 
double(B*C)/double(C) == double((B*C)/C) ? 

Est-ce que la garantie norme IEEE754 cela?

Dans mes tests, il semble fonctionner pour tous les exemples que j'ai essayés. En Python:

>>> (321312321.0*3434343.0)/321312321.0 == 3434343.0 
True 

La raison de demander que Matlab rend difficile de travailler avec ints, donc je souvent il suffit d'utiliser le double par défaut pour le calcul des nombres entiers. Et quand je sais que les entiers sont exactement divisibles, et si je sais que la réponse à la présente question est oui, alors je pourrais éviter de faire des moulages à ints, idivide(..) etc., ce qui est moins lisible.

+1

http://stackoverflow.com/q/3793838/2586922 –

Répondre

1

Le commentaire de Luis Mendo répond à cette question, mais pour répondre spécifiquement à l'utilisation de Matlab, il existe quelques utilitaires pratiques described here. Vous pouvez utiliser eps(numberOfInterest) pour trouver la distance jusqu'au prochain nombre à virgule flottante double précision le plus élevé. Par exemple:

eps(1) = 2^(-52) 
eps(2^52) = 1 

Cela garantit pratiquement que des opérations mathématiques avec des nombres entiers détenus dans un double seront précises à condition qu'ils ne débordent pas 2^52, ce qui est tout à fait un peu plus grand que ce qui est maintenu dans une 32 bits type int.

+0

Donc, le résultat d'une opération sur des doubles est-il le double le plus proche du résultat réel? J'avais l'impression que c'était ce que StrictMath de Java était pour http://docs.oracle.com/javase/7/docs/api/java/lang/StrictMath.html alors que les opérations ordinaires (échange entre rapide et précis) pouvaient conduire à de minuscules erreurs dans le dernier chiffre binaire ou deux. –

+0

Je ne suis pas familier avec Java ou StrictMath, mais j'ai lu la documentation en disant que "strict" se réfère à "[les algorithmes de StrictMath] produisent les mêmes résultats que ... les algorithmes publiés ... du plus connu. .. paquet ... fdlibm ". Autrement dit, les méthodes StrictMath garantissent que vous obtiendrez les mêmes résultats qu'avec les méthodes de fdlibm. Il est certain que les algorithmes utilisés pour les fonctions mathématiques ont des arômes rapides et moins précis ou des arômes plus lents et plus précis. Mais, à moins que je ne me trompe, la division n'a qu'un algorithme, de sorte que cette préoccupation ne s'applique pas ici. –

+0

Pour ce que ça vaut, The Mathworks est généralement transparent sur les algorithmes qu'ils utilisent dans chaque fonction Matlab (voir la documentation). Donc, si vous êtes intéressé par une fonction mathématique particulière, vous devriez être capable d'explorer cela plus attentivement. –

Questions connexes