Puis-je comparer et ajouter un nombre à virgule flottante d'un entier en C?
Peut-on comparer un nombre à virgule flottante d'un entier?
Sera le flotteur comparer des nombres entiers dans le code?
float f; //f has a saved predetermined floating-point value to it
if (f >=100){__asm__reset...etc}
Aussi, pourrais-je...
float f;
int x = 100;
x+=f;
- Je utiliser la valeur à virgule flottante f reçu à partir d'une attitude système de référence pour ajuster une valeur de position x qui contrôle un signal PWM pour corriger l'attitude.
Vous devez vous connecter pour publier un commentaire.
La première fois, beau travail. 100 sera converti en float, et IEE754 peut représenter tous les entiers exactement comme les chars, jusqu'à environ 223.
Le second fonctionne également, mais seront converties en un nombre entier d'abord, vous allez perdre de la précision (qui est inévitable si vous êtes en ce qui concerne les flotteurs en nombres entiers).
Puisque vous identifier comme étant peu familiers avec les subtilités de nombres en virgule flottante, je vais vous référer à cet excellent papier par David Goldberg: Ce Que Tout Informaticien Devez Savoir À Propos De L'Arithmétique À Virgule Flottante (réimpression au Soleil).
Après avoir été effrayé par ce que, la réalité est que plus du temps à virgule flottante est un énorme avantage pour obtenir des calculs effectués. Et les compilateurs modernes et de langues (y compris C) gérer les conversions judicieusement de sorte que vous n'avez pas à vous soucier d'eux. À moins que vous.
Les points soulevés au sujet de la précision sont certainement valables. Un IEEE flotteur efficacement a seulement 24 bits de précision, ce qui est inférieur à un entier de 32 bits. L'utilisation de
double
pour les calculs de pousser tous arrondissement et de la perte de précision due à la conversion versfloat
ouint
.En mode mixte de l'arithmétique (l'arithmétique entre les opérandes de types différents et/ou des tailles) est légal, mais fragile. La norme définit des règles pour le type de promotion en vue de convertir les opérandes d'une représentation commune. Automatique type de promotion permet au compilateur de faire quelque chose d'intelligent pour mixed-mode d'opérations, mais "sensible" ne veut pas nécessairement dire "correcte".
Vraiment de savoir si oui ou non le comportement est correct, vous devez d'abord comprendre les règles de promotion et de comprendre la représentation des types de données. Dans très conditions générales:
float
àdouble
,short
àint
, etc.)non signé, ou vice-versa dépend de la taille respective des types)
Si le code comme
x > y
(oùx
ety
de différents types) est bonne ou mauvaise dépend des valeurs quex
ety
peut prendre. Dans mon expérience, il est de pratique courante d'interdire (par l'intermédiaire de la norme de codage) les conversions de type implicites. Le programmeur doit tenir compte du contexte et explicitement toutes les conversions nécessaires.Pouvez-vous comparer un flotteur et d'un entier, c'est sûr. Mais le problème que vous rencontrerez, c'est la précision. Sur la plupart des C/C++ implémentations, float et int ont la même taille (4 octets) et sauvagement différents niveaux de précision. Ni le type peut contenir toutes les valeurs de l'autre type. Depuis un type ne peut pas être converti à l'autre sans perte de précision et les types ne peuvent pas être natif de par rapport, faire une comparaison sans tenir compte d'un autre type de résultat dans la perte de précision due dans certains scénarios.
Ce que vous pouvez faire pour éviter la perte de précision due est de convertir les deux types d'un type qui a suffisamment de précision pour représenter toutes les valeurs de float et int. Sur plus systèmes, double permettra de faire exactement cela. Donc la suite n'est généralement un non-destructive comparaison
LHS définit la précision,
Donc, si votre LHS est de type int et RHS est float, alors cela entraîne une perte de précision.
Aussi jeter un oeil à FP liées CFAQ
Oui, vous pouvez les comparer, vous pouvez faire des maths sans terriblement égard pour qui est qui, dans la plupart des cas. Mais seulement plupart des. La grande hantise est que vous pouvez vérifier pour
f<i
etc. mais il ne doit pas vérifierf==i
. Un entier et d'un flotteur qui "devraient" être identiques en valeur ne sont pas nécessairement identiques.Ouais, ça marchera très bien. Plus précisément, l'int sera convertie en float pour les fins de la conversion. Dans le second, vous aurez besoin de cast en int, mais il devrait être bien le contraire.
Oui, et parfois, il va faire exactement ce que vous attendez.
Comme les autres l'ont souligné, en comparant, par exemple, 1.0 == 1 fonctionnera, car l'entier 1 est de type cast à
double
(pasfloat
) avant la comparaison.Cependant, d'autres comparaisons peuvent pas.
À ce sujet, la note 1.0 est de type double, donc la comparaison est faite en double par type de règles de promotion comme l'a dit avant. 1.f 1,0 f est de type float et la comparaison aurait été faite en float. Et il aurait fonctionné aussi bien, puisque nous avons dit que les 2^23 premiers entiers sont representible dans un flotteur.