OVH Cloud OVH Cloud

calcul flottant et cast int

3 réponses
Avatar
Kira
Salut,

J'ai un gros doute.

Est-ce que le comportement de :
(int)(40 * 1.50) est défini ?

Et est-ce assuré de retourner toujours 60 ?

Merci.
--
Ce message a été posté via la plateforme Web club-Internet.fr
This message has been posted by the Web platform club-Internet.fr

http://forums.club-internet.fr/

3 réponses

Avatar
Jean-Marc Bourguet
Kira writes:

Est-ce que le comportement de :
(int)(40 * 1.50) est défini ?

Et est-ce assuré de retourner toujours 60 ?


Je crois que oui mais indirectement par la contrainte sur le nombre de
chiffres significatifs et donc que 40 * 1.50 n'est pas assure de
valoir (double)(60).

En pratique, je ne connais pas d'implementation des nombres en virgule
flottante qui n'ait pas un resultat exact dans ce cas (en base 2, 10
et 16 qui a ma connaissance sont les seules a etre et meme a avoir ete
employee, le calcul est exact; ok, j'ai bien entendu des rumeurs au
sujet d'un ordinateur russe des annees 50 ou 60 qui fonctionnait en
ternaire, mais je ne sais pas s'il y avait des flottants dessus).

Change le 1.5 par quelque chose qui ne soit pas un entier divise par
une puissance de deux, et ca devient plus amusant.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Horst Kraemer
On 10 Jul 2003 06:18:41 GMT, Kira wrote:


Salut,

J'ai un gros doute.

Est-ce que le comportement de :
(int)(40 * 1.50) est défini ?

Et est-ce assuré de retourner toujours 60 ?


Selon la norme du langage C le comportement est défini mais le
résultat n'est pas garanti. Mais tout système réel qui ne retourne pas
60 dans ce cas spécial serait sérieusement buggy.

Attention: Le résultat de (int)(40*1.2) peut être ou bien 48 ou 47.

--
Horst

Avatar
Antoine Leca
"Kira" écrivit:
Est-ce que le comportement de : (int)(40 * 1.50) est défini ?


Oui

Et est-ce assuré de retourner toujours 60 ?


Non (en général; peut-être oui si tu ajoutes d'autre contrainte, comme par
exemple FLT_RADIX == 16).


Antoine