10
votes

En C, spécifie 2.0f de la même manière que 2,000000F?

Ces lignes sont identiques?

float a = 2.000000f;


6 commentaires

Si (2.0f == 2.000000F), alors oui.


Eh bien, que se passe-t-il si vous essayez cela? Avez-vous regardé la sortie du compilateur?


S'il vous plaît, essayez d'abord alors demander


Essayer simplement d'essayer rarement de vous donner des réponses définitives en C ou C ++.


Il ne s'agit pas de savoir si 2.0f est égal à 2.000000F , mais la question générale de savoir si ces représentations différentes ont une influence sur l'exécutable ou non. Et le fait que sur une machine utilisant un compilateur, aucune différence ne signifie pas que ce sera toujours vrai sur les drapeaux de plate-forme / compilateur / compilation.


La règle numéro un sur de même pour répondre à la question de l'effondre poliment . Wanna Go Re-Lister le FAQ ? Nous sommes ici pour répondre aux questions, pas pour exiger la preuve ou quoi que ce soit d'autre.


4 Réponses :


11
votes

Oui, c'est. Quelle que soit la représentation que vous utilisez, lorsque le code est compilé, le numéro sera converti en une représentation binaire unique. Il n'y a qu'une seule façon de représenter 2 dans le IEEE 754 BINARY32 Standard utilisée dans les ordinateurs modernes pour représenter float .


4 commentaires

Cependant, il existe d'autres normes (je pense à IBM 360) toujours en cours d'utilisation où les chiffres ont plusieurs représentations ... (Je ne sais pas si 2 est l'un d'entre eux, bien que)


IEEE 754 permet de représenter plusieurs représentations de la même valeur, notamment en point variant décimal. Par exemple, 2 pourrait être, en effet, 2e0 et 20e-1. Cependant, les textes de source "2.0F" et "2.000000F" sont peu susceptibles de donner lieu à des représentations différentes, et il n'y a pas de différence de valeur mathématique.


Mais les programmes informatiques n'utilisent pas du tout les représentations décimales et dans des représentations binaires, vous ne pouvez pas faire cela, car il existe un 1. a été ajouté à la fraction partie de le nombre. J'ai édité la réponse pour préciser que la représentation binaire32 est utilisée.


Si un programme utilise un point flottant décimal ou non dépend de la mise en œuvre C (ou autre langue). Il est tout simplement faux de dire que les programmes d'ordinateur ne les utilisent pas. Pourquoi d'autre existeraient-ils?



1
votes

Oui, c'est sûr que c'est le même supplément de zéros à droite sont ignorés, aime simplement les zéros à gauche


3 commentaires

En fait, les zéros à gauche font une différence.


00002.0 est similaire à 02.0 Aucune différence à moins que jeûne ou quelque chose


@Shéhabox, ce que David signifiait (ou donc je pensais) était que 010 est différent de 10. Le premier est de 8 en décimal et ce dernier est 10.



3
votes

Oui, ils sont les mêmes.

Vérification simple: http://codepad.org/foqsufb4 xxx

^ Va sortir 1 (vrai)


2 commentaires

Eh bien, prouve qu'un compilateur exemplaire n'est pas une preuve. (Votre réponse est bien sûr correcte, mais le chèque n'est pas une preuve.)


Vous avez raison, j'aurais dû utiliser un libellé différent. Cela semblait suffisant dans ce cas, cependant. La norme IEEE pourrait être référencée pour une réponse plus approfondie.



9
votes

La seule chose que la norme C99 a à dire à ce sujet est celle-ci (section 6.4.4.2):

pour les constantes de flottement décimales ... Le résultat est soit la valeur représentable la plus proche, ou la valeur représentative plus grande ou plus petite immédiatement Adjacent à la valeur représentable la plus proche, choisie de manière définie par la mise en œuvre.

Ce bit sur "défini par la mise en œuvre" signifie que techniquement une implémentation pourrait choisir de faire quelque chose de différent dans chaque cas. Bien que dans la pratique, rien de bizarre ne se produise pour une valeur comme 2.

Il est important de garder à l'esprit que les normes C ne nécessitent pas IEEE-754.


1 commentaires

Maintenant, si IEEE-754 est utilisé, le nombre 2 est exactement représentable et ses voisins ("la plus grande ou la plus petite valeur représentable immédiatement adjacente à la valeur représentable la plus proche") sont 1.99999988 et 2.00000024 . Nous pouvons voir que le voisin à droite est deux fois plus loin, car nous avons un peu moins pour la partie fractionnée lorsque nous passons à la suivante "Duade" 2.0 à 4.0 .