selligattangip
Messages postés1Date d'inscriptionjeudi 23 janvier 2003StatutMembreDernière intervention 8 janvier 2008 8 janv. 2008 à 22:50
merci pour toutes ces precisions. Je ne savais pas que pow n'etait pas portable, cette fonction ne me plait pas non plus surtout dans des calculs mettant en jeu des puissances de 2... Mais j'avais cherché une methode plus portable que ma premiere solution de copier les 4 octets recupérés dans un trame modbus dans un float et je n'avais bizarrement pas trouvé d'exemples en C sur le net, donc j'ai pensé que ça pouvait aider à trouver des methodes plus optimisées... Et j'aimerais connaitre quelle est la fonction qui permet de calculer une puissance entiere de 2
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 janvier 2019 8 janv. 2008 à 04:27
Portable? Hmmm... pas si évident car la fonction utilise pow() pas forcément définie (et qui devra de toute façon aussi réaliser les mêmes opérations pour convertir l'exposant en flottant valide, en tenant compte des décimales possibles de l'exposant).
Il manque aussi le support des NaN et valeurs infinies (aucune vérification sur la valeur de l'exposant lu par simple masquage binaire, alors que la valeur minimale de l'exposant, quand on le convertit en entier signé, indique ces valeurs spéciales, et dans ce cas la mantisse s'interprète différemment et peut contenir aussi des valeurs "dénormales" proches de zéro mais avec une précision réduite).
Enfin la routine ne gère pas non plus le "moins zéro" (défini dans la norme IEEE754 pour conserver le signe de l'inverse d'une valeur infinie afin de prolonger certains calculs en maintenant une précision sur le signe sans invalider nécessairement l'utilisation de la valeur obtenue comme argument d'une autre fonction).
Sinon l'interprétation de la mantisse bit par bit dans une boucle est une méthode particulièrement inefficace! On peut utiliser la mantisse directement sans faire appel à cette boucle, en jouant sur la valeur de l'exposant de base 2.
Enfin il existe une fonction pour calculer une puissance entière de 2, nettement plus efficace que pow(), bien que pow() l'utilise aussi (en combinaison avec les fonctions d'extraction de partie entière et partie fractionnaire)! Et toutes les biliothèques de calcul IEE754 supportent une fonction de conversion entre une représentation binaire entière et la valeur flottante associée (ou l'inverse).
La prochaine version de la norme gérera en plus des flottants simple et double précision (codés sur 32 ou 64 bits) des flottants en précision fixe, et des flottants codés en décimal (BCD, mais une aussi amélioration encore plus compacte du BCD) pour les calculs financiers ou à précision décimale imposée, ainsi qu'un format encore plus long sur 128 bits.
La finalisation de cette version est en cours, la nouvelle version de la norme (dont le texte pratiquement finalisé est disponible, on sait déjà quels formats standards il y aura, et les primitives de calcul seront aussi étendues) est déjà devrait sortir cette année, en principe au printemps.
On devrait en disposer alors dans toutes les plateformes assez vite (Les versions beta sont déjà disponibles pour Windows, MacOSX, Linux, BSD... et avec différents compilateurs de différents fournisseurs, et pour de nombreux langages, pas seulement le C, mais aussi des versions optimisées pour de nombreux processeurs, et les prochaines versions de processeurs supporteront nativement ces formats flottants et un certain nombre de primitives standards; les travaux actuels sont surtout destinés à évaluer les performances et produire une certification de la précision des calculs obtenus avec des outils de tests très précis, car la norme sera encore plus exigeante en terme de précision).
cs_omnia
Messages postés240Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention22 mars 2009 5 janv. 2008 à 10:50
Salut,
Pour ce genre de source il aurait été plus judicieux de la mettre dans les snippets.
8 janv. 2008 à 22:50
8 janv. 2008 à 04:27
Il manque aussi le support des NaN et valeurs infinies (aucune vérification sur la valeur de l'exposant lu par simple masquage binaire, alors que la valeur minimale de l'exposant, quand on le convertit en entier signé, indique ces valeurs spéciales, et dans ce cas la mantisse s'interprète différemment et peut contenir aussi des valeurs "dénormales" proches de zéro mais avec une précision réduite).
Enfin la routine ne gère pas non plus le "moins zéro" (défini dans la norme IEEE754 pour conserver le signe de l'inverse d'une valeur infinie afin de prolonger certains calculs en maintenant une précision sur le signe sans invalider nécessairement l'utilisation de la valeur obtenue comme argument d'une autre fonction).
Sinon l'interprétation de la mantisse bit par bit dans une boucle est une méthode particulièrement inefficace! On peut utiliser la mantisse directement sans faire appel à cette boucle, en jouant sur la valeur de l'exposant de base 2.
Enfin il existe une fonction pour calculer une puissance entière de 2, nettement plus efficace que pow(), bien que pow() l'utilise aussi (en combinaison avec les fonctions d'extraction de partie entière et partie fractionnaire)! Et toutes les biliothèques de calcul IEE754 supportent une fonction de conversion entre une représentation binaire entière et la valeur flottante associée (ou l'inverse).
La prochaine version de la norme gérera en plus des flottants simple et double précision (codés sur 32 ou 64 bits) des flottants en précision fixe, et des flottants codés en décimal (BCD, mais une aussi amélioration encore plus compacte du BCD) pour les calculs financiers ou à précision décimale imposée, ainsi qu'un format encore plus long sur 128 bits.
La finalisation de cette version est en cours, la nouvelle version de la norme (dont le texte pratiquement finalisé est disponible, on sait déjà quels formats standards il y aura, et les primitives de calcul seront aussi étendues) est déjà devrait sortir cette année, en principe au printemps.
On devrait en disposer alors dans toutes les plateformes assez vite (Les versions beta sont déjà disponibles pour Windows, MacOSX, Linux, BSD... et avec différents compilateurs de différents fournisseurs, et pour de nombreux langages, pas seulement le C, mais aussi des versions optimisées pour de nombreux processeurs, et les prochaines versions de processeurs supporteront nativement ces formats flottants et un certain nombre de primitives standards; les travaux actuels sont surtout destinés à évaluer les performances et produire une certification de la précision des calculs obtenus avec des outils de tests très précis, car la norme sera encore plus exigeante en terme de précision).
5 janv. 2008 à 10:50
Pour ce genre de source il aurait été plus judicieux de la mettre dans les snippets.
bon codage :)