2010-04-14 3 views
4

Nous faisons cette application web en PHP et lorsque nous travaillons dans les rapports, nous avons des fichiers Excel pour comparer nos résultats afin de nous assurer que notre codage fait les bonnes opérations.Toutes les opérations de virgule flottante du système sont-elles identiques?

Maintenant, nous sommes confrontés à des différences dues à l'arithmétique en virgule flottante. Nous faisons les mêmes divisions et multiplications et nous rencontrons des nombres légèrement différents, ce qui représente une différence notable.

Ma question est de savoir si Excel délègue son arithmétique en virgule flottante à la CPU et PHP s'appuie également sur le processeur pour ses opérations. Ou chaque application implémente-t-elle son propre ensemble d'algorithmes mathématiques?

+3

Que représentent vos flotteurs? Argent? Mauvaise idée: utiliser un point fixe, ne pas flotter pour de l'argent. – staticsan

Répondre

3

Microsoft Excel utilise le type double natif sur une machine particulière pour effectuer ses calculs. Je ne sais pas exactement ce que PHP utilise.

Cependant, il convient de noter que même la copie d'un nombre à virgule flottante sur des machines x86 peut changer sa valeur. Les points flottants sont stockés en interne dans des registres de 80 bits de large. Ils sont stockés en mémoire dans des blocs de 64 bits de large. Par conséquent, en supposant qu'Excel et PHP s'exécutent sur des machines basées sur x86, vous pouvez obtenir des valeurs différentes même avec des calculs similaires. Particulièrement aux extrémités des plages supportées par les types à virgule flottante.

Enfin, il existe une différence évidente entre les double que Excel utilise, et (si votre code PHP en utilise un) float en code PHP. Assurez-vous de ne pas les mésapparier car float s ont beaucoup moins de précision.

EDIT: A oublié aussi - il y aura des différences de sortie si PHP ou Excel (plus probablement Excel) utilise des extensions SSE, car leurs opérations en virgule flottante fonctionnent sur 64 bits, pas 80 bits, double .

+0

@duffymo: Merci d'avoir résolu cela :) Peut-être que je ne devrais pas répondre à des questions tout en travaillant sur d'autres choses. –

+0

En fait, je pense qu'il est plus probable que PHP utilise SSE2 pour l'arithmétique double. Je m'attends à ce qu'Excel ait un lourd fardeau de compatibilité obligatoire entre les bogues et les bogues avec les anciennes versions, contrairement à PHP. –

+0

@Stephen Canon: Les gains de SSE ne sont possibles que si le calcul peut être parallélisé de 4 façons. Puisque PHP n'a pas de primitives de parallélisation, je ne pense pas que la mise en œuvre de SSE serait même un gain là-bas. Bien sûr, je pourrais avoir 110% de mal. –

1

La plupart des systèmes mis en œuvre IEEE 754, ce qui n'est pas très bon, mais est assez bon dans la plupart des cas. Si vous voulez une meilleure précision, regardez quelque chose comme GMP.

0

Soyez très prudent lorsque vous traitez avec les calculs flottants PHP. PHP est un langage de script flexible, mais sa flexibilité et sa typographie lâche peuvent causer des dangers lors de la conversion entre types ou la lecture de données.

Je vous suggère fortement de lire le pages on floats dans le manuel PHP. Il y a un module appelé BC Math qui est fourni pour des calculs de précision arbitraires, et selon ce que vous faites, vous pouvez en profiter.

0

Pour une précision plus longue mais non arbitraire, essayez qd.

+1

Pourquoi le vote à la baisse? Ma réponse fut une réponse à la réponse d'Ignacio Vazquez-Abrams; peut-être que ça aurait dû être un commentaire là-bas. – lhf

Questions connexes