Bonjour,
Voici ce que je code:
Laquelle de ces écriture est la plus correcte?Code:
1
2
3
4
5
6
7
8 unsigned int C4; float UT1; .. UT1 = (float) (8.0 * (float)C5 + 10000.0); //ou bien UT1 = 8 * (float)C5 + 10000; ...
Merci
Pegase.90
Version imprimable
Bonjour,
Voici ce que je code:
Laquelle de ces écriture est la plus correcte?Code:
1
2
3
4
5
6
7
8 unsigned int C4; float UT1; .. UT1 = (float) (8.0 * (float)C5 + 10000.0); //ou bien UT1 = 8 * (float)C5 + 10000; ...
Merci
Pegase.90
lol aucune précisément...
:P
ce serait :
mais par défaut la norme indique la promotion automatique d'un int en float ou double lors d'une telle opération. Donc on peut s'en passer (dans ce cas, car là c'est une multiplication). Dans le cas d'une division, il faudrait le préciser pour ne pas avoir une division entière.Code:
1
2
3
4
5 unsigned int C4; float UT1; UT1 = 8.0 * (float)C4 + 10000.0; ...
Dans ce cas j'ai un warning"Warning 1 : implicit narrowing cast: '='Code:
1
2
3
4
5 unsigned int C4; float UT1; UT1 = 8.0 * (float)C4 + 10000.0; ...
Pegase.90
Pourquoi aucune ????
UT1 = (float) (8.0 * (float)C5 + 10000.0);
celle ci fonctionnera même si il y'a des cast inutiles
Inutile de caster le C5 en float il y'a conversion du fait que tu multiplies par un nombre à virgule (8.0) le cast global assure la converion mais est facultatif.
UT1 = 8 * (float)C5 + 10000;
Celle-ci devrait également fonctionner car du fait de ton cast tu as une multiplication par un float donc résultat en float
En terme de compréhension la première est peut être plus parlante mais certains coder se demanderont pourquoi tu fais tout ces casts.
Le plus rapide est de faire
UT1 = 8.0 * C5 + 10000;
Pour répondre à ta question je dirais que la plus correcte est la première ... juste pour une histoire de compréhension.
A vérifier mais les réels sont des double (long double?) qui sont plus gros que les float donc tu as un risque de pertes de données .... donc warning.Citation:
Envoyé par pegase.90
Dans mon système:Citation:
Envoyé par Darwiz
char: 8-bit integer;
short int: 16-bit integer;
int: 16-bit integer;
long int: 32-bit integer;
float: 32-bit IEEE floating point number;
double: 64-bit IEEE floating point number;
long double: 64-bit IEEE floating point number;
int *pointer: 16-bit word address in data space,
char *pointer: 17-bit byte address in data space (size=32 bits),
int (*pointer)(): 24-bit address in code space (size=32 bits).
Pegase.90
Parce que le PO demande "quelle est la plus correcte"..Citation:
Envoyé par Darwiz
eh bé NON.. Voir plus haut... La plus correcte est la 2 parmi celle proposée, puisqu'elle n'a qu'un cast..Citation:
Envoyé par Darwiz
float 32 bits (4 octets)
double 64 bits (8 octets)
quand tu fais 8.0 * (float)C5
D'après mes souvenirs chaque compilateur a sa manière de gérer les réels mais si le compilo considère par défaut que c'est un double on a donc :
8.0 est considéré comme un double
C5 avec le cast est donc un float
double * float = double
et tu fais
UT1 = double
or UT1 est un float donc tu veux mettre un double dans un float
le compilo fait un cast implicite de double en float ... donc Warning, rien de grave ça fait pas joli donc on met un cast comme tu l'as fait dans ton premier code.
bah...Citation:
Envoyé par Darwiz
Sa variable est un float, il caste avec un float, donc ton raisonnment est totalement faux.
voir ci-dessous...
et le warning est certainment un mauvais réglage de compilateur ou un compilateur non conforme à la norme, pusique par défaut cela doit être PROMU au cours de l'opération en fonction du résultat...
La plus correcte est un concept variable car cela peux prendre différents critères
Correcte en terme de maintenance de code et de compréhension : La première
Correcte en terme de codage simple : La deuxième
Je fais beaucoup de maintenance de code et de corrections de bug donc je prend la première car pas besoin de prendre la place du compilo pour savoir ce qu'il se passe :P même si le code est pas optimisé pour la compil.
Bref ça me donne pas mon arbre de recherche tout ça :(
la norme C99 dit :
et aussi :Citation:
1 When a float is promoted to double or long double, or a double is promoted
to long double, its value is unchanged.
2 When a double is demoted to float, a long double is demoted to double or
float, or a value being represented in greater precision and range than required by its semantic type (see 6.3.1.8) is explicitly converted to its semantic type, if the value being converted can be represented exactly in the new type, it is unchanged. If the value being converted is in the range of values that can be represented
Donc oui le signe '=' pourrait éventuellement générer un warning, qui est idiot dans ce cas puisqu'avec 2 constantes et une varaible float et un résultat float.. Mais si on suit ce que dit la norme, dans le cas de figure présenté ci-dessus, cela ne devrait pas générer de warning..Citation:
1 Many operators that expect operands of arithmetic type cause conversions and yield result types in a similar way. The purpose is to determine a common real type for the operands and result. For the specified operands, each operand is converted, without change of type domain, to a type whose corresponding real type is the common real type. Unless explicitly stated otherwise, the common real type is also the corresponding real type of
the result, whose type domain is the type domain of the operands if they are the same, and complex otherwise. This pattern is called the usual arithmetic conversions: First, if the corresponding real type of either operand is long double, the other operand is converted, without change of type domain, to a type whose corresponding real type is long double.
Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose
corresponding real type is double. Otherwise, if the corresponding real type of either operand is float, the other operand is converted, without change of type domain, to a type whose corresponding real type is float.
...
The values of floating operands and of the results of floating expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.52)
52) The cast and assignment operators are still required to perform their specified conversions as described in 6.3.1.4 and 6.3.1.5.
Il est évident que la norme donne le bon procédé mais tout dépend du compilo comme je l'ai marqué ... puis quand on a utilisé Visual on doute de tout lol.
Bref j'arrête là car tout a été dit.