2017-04-05 5 views
3
var num1 = 1.1 
if num1 + 0.1 == 1.2 {print("true")} else {print("false")} 

Résultat: falsedifférence Surprenant pour virgule flottante Arrithmetic pour double vs flotteur

var num1: Float = 1.1 
if num1 + 0.1 == 1.2 {print("true")} else {print("false")} 

Résultat: true

L'ancien bloc de code a num1 qui représente un double et le dernier bloc de code a num1 qui représente un flotteur.

Ma question: Pourquoi le code avec Float est-il vrai et celui avec Double non?

+0

@Leo Dabus Celui que vous avez suggéré ne répond pas à ma question. Je sais qu'il parle de la précision du nombre à virgule flottante, mais il n'y a aucune partie de la discussion qui mentionne pourquoi float renvoie true et le double ne le fait pas. Alors s'il vous plaît examiner à nouveau et supprimer le doublon de ma question. – THCoder

+0

Flotteur à simple précision et double à double précision. –

+0

@Leo Dabus Je pense que c'est une question valide, je suis curieux de connaître la différence entre 'Float' et' Double' aussi. Si quelque chose il devrait être l'inverse ... –

Répondre

1

Ce est un double et je terminerai en tant que tel, mais voici un exemple des raisons pour lesquelles cela fonctionne pour Float mais pas pour Double. Au lieu de regarder Double et Float, regardons deux nouveaux types. Eighths et Sixteenths. Eighths a 3 bits pour représenter des nombres fractionnaires, afin que vous puissiez représenter 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75 et 0.875. Sixteenths a 4 bits pour représenter les nombres fractionnaires, donc vous pouvez représenter 0, 0.0625, 0.125, 0.1875, 0.25, et ainsi de suite. Dans les deux types de nombres, il sera nécessaire d'approcher les valeurs à virgule flottante en choisissant la valeur la plus proche de celle que vous souhaitez représenter.

Regardons donc à quoi ressemble 1.1 + 0.1 dans Eighths et Sixteenths.

eighths
1.1 = 1.125 
0.1 = 0.125 
1.2 = 1.25 

1.1 + 0.1 = 1.125 + 0.125 = 1.25 

si 1.1 + 0.1 == 1.2 dans Eighths

seizièmes

1.1 = 1.125 
0.1 = 0.125 
1.2 = 1.1875 

1.1 + 0.1 = 1.125 + 0.125 = 1.25 

si 1.1 + 0.1 != 1.2 dans Sixteenths.

La plus grande précision de Sixteenths permet de représenter plus précisément 1.2 avec une valeur plus petite lorsqu'elle est représentée en Sixteenths.

C'est ce qui se passe avec Float s et Double s. Il y a plus de bits disponibles pour représenter les nombres, mais ce sont quand même des approximations. Lorsque vous faites des calculs avec ces approximations, l'erreur se combine de manière inattendue, c'est pourquoi il est mal avisé d'utiliser des comparaisons égales avec des valeurs à virgule flottante.

+0

Merci pour la réponse! Puis-je savoir comment comparer les nombres à virgule flottante si je ne peux pas utiliser les comparaisons égales? – THCoder

+0

Ceci est intéressant: http://stackoverflow.com/a/4915891/1630618 – vacawama