for (i=0;i<8;i++) { tab[i]=(mot & (int) pow(2,i))/(int) pow(2,i); }
Mais je sais pas si c'est l'idéal de faire ca comme ca, j'ai essayé avec des structures et des unions mais sans reussite.
Merci de votre aide
for (i=0;i<8;i++) { tab[i]=(mot & (int) pow(2,i))/(int) pow(2,i); }
(heureusement, sinon ça serait difficile de faire des algorithmes portables)Un algorithme qui s'appuie sur la précision des nombres est mal conçu de toutes façons.
spectras :
Tu connais les opérations qui sont dangereuses en flottant. Tu ne les utilises pas si tu fais des calculs flottant. C'est aussi simple que ça.
Notamment les additions et soustractions de flottants qui sont deux opérations casse-gueules à souhait.
spectras :
L'erreur sur des flottants, ça se compte pas en bits hein. Je te rappelle que t'as un exposant devant, et pourvu que tu additionnes avec des grandeurs différentes, ton bit d'erreur se trouve multiplié par beaucoup.
Par exemple euh je sais pas y'a plein de possibilités.
=> (a+b)+c == a+(b+c) Attends-toi à des surprises si tu travailles sur des flottants ^^
=> J'ai plus l'exemple en tête là mais en cours (vivi on a eu un cours sur les flottants en maths) la prof avait montré un exemple qui aboutissait à une erreur de 900%
Les additions de flottant, c'est un truc super casse-gueule.
On a mis une Ariane au tapis à cause d'une erreur de flottant.
Les missiles Patriot ont connu de nombreux problèmes liés à ce type d'erreur, dont un accident ayant tué 26 personnes.
On ne reparlera plus évidemment de la fameuse imprécision de l'instruction FDIV du pentium, dont la cause a été remontée aux additions réalisées en interne.
Tiens juste une question....dans un programme à contexte mathématique, comment tu comparerais 2 flottants ?
Mais loul quoi ! En parlant d'"erreur d'un bit de poids faible", je voulais dire "erreur d'un bit de poids faible de la mantisse, à exposant égal", me prend pas pour un con...Bah oué mais il fallait préviser le à exposant égal. Et puis si tout tes calculs ont un exposant égal, tu peux utiliser des entiers hein ça sera pas plus compliqué.
Bien sûr, je ne parle pas d'une borne magique qui ferait qu'une suite d'opérations arbitraires sur des flottants aurait une erreur bornée... Je parle d'une borne non-magique, parfaitement spécifiée, qui porte sur *une* opération.Oui, mais l'exemple portait sur un calcul simple, du même genre que celui que j'ai mis.
En l'occurrence, pour une addition a+b, [...] [...]De même, cette spécification claire peut te garantir que tel autre calcul te donnera, lui, des conclusions correctes... (et c'est tout l'intérêt de la chose)A ceci justement que là le problème est évident parce que je l'ai isolé. Mais c'est un problème qui rode dans n'importe quel calcul en flottant, et qui sera pas aussi évident. Comment peux-tu avoir la garantie de ne jamais tomber sur le cas qui foire ? Comment peux-tu avoir la garantie que telle fonction que tu appelles, par exemple une TF ou le calcul d'une intégrale ne vas jamais tomber sur un cas qui merde ? Ou la résolution d'une équadiff ?
C'est inexact voire faux : c'est un débordement d'un compteur inutilisé, qui a lancé une exception non rattrapée. Ca n'a rien d'une erreur d'arrondi, et ça serait également arrivé si le compteur en question avait été un entier...L'erreur d'origine était provoqué par une conversion d'un flottant en entier. C'est cette conversion qui a débordé, parce que le flottant en question a pris des valeurs non prévues, liées à des mesures donnant des valeurs différentes des versions précédentes.
Je sais pas moi, comment tu implémenterais par exemple ...euh le calcul d'une racine carrée ?Tiens juste une question....dans un programme à contexte mathématique, comment tu comparerais 2 flottants ?
Muf ? Ca veut dire quoi ?
spectras
:Mais loul quoi ! En parlant d'"erreur d'un bit de poids faible", je voulais dire "erreur d'un bit de poids faible de la mantisse, à exposant égal", me prend pas pour un con...Bah oué mais il fallait préviser le à exposant égal. Et puis si tout tes calculs ont un exposant égal, tu peux utiliser des entiers hein ça sera pas plus compliqué.
Bien sûr, je ne parle pas d'une borne magique qui ferait qu'une suite d'opérations arbitraires sur des flottants aurait une erreur bornée... Je parle d'une borne non-magique, parfaitement spécifiée, qui porte sur *une* opération.Oui, mais l'exemple portait sur un calcul simple, du même genre que celui que j'ai mis.
En l'occurrence, pour une addition a+b, [...] [...]De même, cette spécification claire peut te garantir que tel autre calcul te donnera, lui, des conclusions correctes... (et c'est tout l'intérêt de la chose)A ceci justement que là le problème est évident parce que je l'ai isolé. Mais c'est un problème qui rode dans n'importe quel calcul en flottant, et qui sera pas aussi évident. Comment peux-tu avoir la garantie de ne jamais tomber sur le cas qui foire ? Comment peux-tu avoir la garantie que telle fonction que tu appelles, par exemple une TF ou le calcul d'une intégrale ne vas jamais tomber sur un cas qui merde ? Ou la résolution d'une équadiff ?
La réponse est : on ne sait pas prévoir ce genre de choses à l'avance dès que les calculs ne sont pas triviaux.
C'est inexact voire faux : c'est un débordement d'un compteur inutilisé, qui a lancé une exception non rattrapée. Ca n'a rien d'une erreur d'arrondi, et ça serait également arrivé si le compteur en question avait été un entier...L'erreur d'origine était provoqué par une conversion d'un flottant en entier. C'est cette conversion qui a débordé, parce que le flottant en question a pris des valeurs non prévues, liées à des mesures donnant des valeurs différentes des versions précédentes.
static double x = 0; for (;!fusée_en_orbite();) x += 1;
static true_real x = 0; for (;!fusée_en_orbite();) x += 1, do_stuff_with((int)x);
static int x = 0; for (;!fusée_en_orbite();) x += 1;
Je sais pas moi, comment tu implémenterais par exemple ...euh le calcul d'une racine carrée ?
double sqrt(double x) { if (x>=1 && x<4) { double s = 1, bit = 0.5; while (s+bit != bit) { double t = s+bit; if (t*t >= x) s = t; bit *= 0.5; } return s; } else if (x<1) return sqrt(4*x)*0.5; else return sqrt(0.25*x)*2; }
Mais c'est pas contre les flottants en général que j'en ai. Uniquement contre les additions et soustractions, sources de tous les problèmes potentiels. Le simple fait d'écrire "a = b - c" est déjà un bug latent selon les valeurs que b et c peuvent prendre.
Pollux :
(à moins d'utiliser uniquement de l'arithmétique entière)
Pollux :
C'est d'autant plus crucial que, même si la précision n'est pas toujours primordiale quand tu n'as pas de boucles ou de feedback, une erreur d'un bit de poids faible cumulée sur plein d'itérations risque bien de devenir gigantesque (divergence).
spectras :
On a mis une Ariane au tapis à cause d'une erreur de flottant.
Ximoon
:Pollux :
(à moins d'utiliser uniquement de l'arithmétique entière)
Ton "" est largement déplacé, tu serais surpris de savoir le nombre d'engins embarqués (que ce soit dans les télécoms, l'aéronautique, etc) qui travaillent en virgule fixe.
Pollux :C'est à ça que servent les tests unitaires...
C'est d'autant plus crucial que, même si la précision n'est pas toujours primordiale quand tu n'as pas de boucles ou de feedback, une erreur d'un bit de poids faible cumulée sur plein d'itérations risque bien de devenir gigantesque (divergence).
http://en.wikipedia.org/wiki/Ariane_5_Flight_501#Aftermath : The subsequent automated analysis of the Ariane code was the first example of large-scale static analysis by abstract interpretation.