Sally (./143) :
edit : Pollux > ben si je donne comme relation d'équivalence sur les expressions C : deux expressions sont équivalentes si et seulement si la norme implique qu'elles sont toujours évaluées à la même valeur (donc ça ne dépend bien que du comportement du programme), alors il existe bien un entier N tel que (float) (N+N-N) ne soit pas équivalent à (float) N + (float) N - (float) N, donc la citation est vraie et je vois mal ce que cette relation d'équivalence a de "fondamentalement buggé"...
[ancien post]Pollux > donc si je t'exprime clairement, ça donne : il n'existe pas de relation d'équivalence sur les expressions C telle que : (a) deux expressions qui selon la norme doivent toujours être évaluées à la même valeur sont équivalentes et (b) il existe un entier N tel que (float) (N+N-N) ne soit pas équivalent à (float) N + (float) N - (float) N ?
(le (a) est une tentative de traduction de "ne dépend que du comportement du programme")[/ancien post]
(multicross)
Ben en fait ta définition ça rentre justement dans les trucs fondamentalement buggés : à moins de pouvoir garantir qu'un programme n'a pas d'undefined behaviour, il n'est jamais équivalent à lui-même, ce qui est un peu problématique ^^ (parce que du coup (float)(N+N-N) n'est équivalent à rien du tout, même pas à lui même, donc si tu veux t'en servir pour savoir quelles expressions sont équivalentes / quelles transformations tu peux appliquer à un programme sans lui faire changer de sémantique c'est un peu raté #tricouic#)
Cela dit tu as raison sur le fond, ma remarque ne s'appliquait pas à *toutes* les relations d'équivalence : on pourrait effectivement définir une relation d'équivalence réflexive telle que (float)(N+N-N) n'est pas équivalent à (float)N+(float)N-(float)N, par exemple en s'assurant que si l'une fait une undefined behaviour alors l'autre aussi, et que sinon la valeur obtenue est la même (en fait c'est simplement la plus grande relation d'équivalence contenue dans le pré-ordre "peut être remplacé par" que j'avais défini en
./124).
Bon et du coup je comprends ce qui posait problème à hippo, c'est qu'une opération valide sur des entiers convertis en float n'est pas forcément valide sur les entiers eux-mêmes ; alors que moi je parlais de la structure "image" des ints dans les floats, i.e. où ne sont valides que les opérations dont le résultat reste dans l'image des ints dans les floats, et où là il y a bien plongement... Et puis en fait il n'y avait même pas besoin de floats pour parler de ça : il suffirait de parler de plongement des entiers d'une taille donnée dans des entiers de taille plus grande ou de taille arbitraire, sans que la discussion en soit changée ^^