Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer le type d'une variable

De int vers float ou de float vers int

Sujet résolu
17 août 2009 à 21:46:15

Bonsoir

J'aurai besoin de faire le calcul suivant :

float = (int+int)/2
Avec la division de nombres réels.

ou
int = floor(float)
Me débarrasser de la partie décimale en quelque sorte.

Mais comme une variable est une variable, comment faire ça proprement ?
En cherchant j'ai entendu parler du "Cast" mais je n'ai pas trouvé de tuto qui explique vraiment comment ça marche ...

Merci d'avance !
  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 21:55:58

Et bien si tu veux te débarasser de la partie décimale, tu fais :
double reel = 4.5;
int entier = reel;

Un cast c'est faire ceci par exemple :
double var = (double)5 / 2;

ou force une des 2 opérandes à un type donné.
  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:01:14

Citation : Camp0us


double reel = 4.5;
int entier = reel;

Il y a un "Warning, converting to int from double" dans ce cas la, ce qui me laisse penser que ce n'est pas propre ;)
  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:05:12

Tu peux toujours mettre :

double reel = 4.5;
int entier = (int) reel;


Pour dire à ton compilateur que c'est une conversion explicite :)
  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:05:33

double reel = 4.5;
int entier = (int)reel;

Si tu avais suivit mon petit discours sur les casts tu aurais pu corriger mon erreur ^^

EDIT : grilled
  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:37:05

Bon ben voila, j'ai trouvé le problème de mon programme grâce à vous ;)

J'étais en
float reel = Uint8 / 2

Et le compilateur n'ajoute pas automatiquement le (float) pour ce type un peu spécial, donc j'avais des résultats débiles :D

float reel = (float)Uint8 / 2

C'est mieux comme ça !


  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:41:28

Citation : Bvic

float reel = (float)Uint8 / 2


C'est mieux comme ça !


float reel = Uint8 / 2.

Fonctionne aussi =)
L'important est qu'un des deux opérandes soit un flottant pour que l'autre soit convertit.

Citation : Norme

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.



----

Citation : Camp0us

Si tu avais suivit mon petit discours sur les casts tu aurais pu corriger mon erreur


Tu n'as pas fait d'erreur =)

@Bvic: L'avertissement doit-être là juste pour signaler la possibilité que la partie entière du réel n'est pas forcément représentable par une int (dans ce cas là c'est un UB); mais ça, le cast ni change rien.

Ceci est vrai que la conversion soit causée par un cast ou par un assignment :

Citation : Norme

When a finite value of real floating type is converted to an integer type [...], the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.)

  • Partager sur Facebook
  • Partager sur Twitter
17 août 2009 à 22:42:56

Tu utilises la SDL ? Si c'est le cas, sache qu'un Uint8 n'est autre qu'un vulgaire unsingned char. Un entier, donc. Aucune raison que le compilateur fasse de lui-même un cast ;)
Mais bon, après, si tu dois diviser par une constance comme dans ton exemple, autant utiliser une constante réelle :
float reel = entier / 2.0;
  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2024 à 19:40:21

bsr svp comment rentre une variable de type entier en une variable réel  parce que quand j'écrire (flaot)int ça ne prend pas .

  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2024 à 20:26:56

Ce n'est pas flaot mais float !
  • Partager sur Facebook
  • Partager sur Twitter
...
19 janvier 2024 à 21:05:00

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)