Envoyé par
souviron34
Normal
ton numérateur, même passé en float, reste un entier..
Et comme ton DIVISEUR est entier, la division est entière..
Non. Dans une opération a 2 opérandes avec opérandes de différents types, l'opération est réalisée dans le type le plus précis des deux.
Ex: double a=7.0 / (int)2 => a=3.5
Si l'opération fait intervenir plus de 2 opérandes, alors elle est découpée en "n" opérations de 2 opérandes (selon les règles des priorités) et chaque opération est réalisée selon les règles ci-dessus
Ex: double a=5.0 + 3 / 2 => D'abord le 3/2 est évalué dans le type le plus précis des deux int => donne 1 qui, additionné au 5.0 te donne 6.0
Envoyé par
souviron34
et je pense que ça marchera aussi si tu enlèves le cast du deuxième rand...
Là oui (cela ramène au 1er exemple)
Envoyé par
souviron34
et les parenthèses , pour ma part, je les spécifie toujours, car je ne veux pas dépendre de l'ordre d'évaluation..
Boaf. Tant qu'on reste aux opérateurs mathématiques on peut s'en passer. Mais t'as quand-même bien fait de répondre car cela m'a donné une idée de la vraie cause du problème
Envoyé par
rhani-sama
T[i]=rand()+(float)rand()/RAND_MAX;
Quand tu fais float()rand()/RAND_MAX, je pense que le cast "float()" est appliqué sur "(rand()/RAND_MAX)". Or, il faudrait l'appliquer sur "rand()" avant de diviser
T[i]=rand()+((float)rand())/RAND_MAX;
[edit qq heures plus tard]
Non, j'ai dit une connerie. Le cast est prioritaire sur la division. autrement dit, que tu fasses "(float)3 / 2" ou ((float) 3) / 2)" t'obtiens toujours 1.5.
Aujourd'hui, j'ai tapé le code suivant
1 2 3 4 5 6 7 8
| #include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
for(i=0;i<n;i++)
printf("%f\n", rand()+(float)rand()/RAND_MAX);
} |
Ben ça m'a fait exactement comme prévu, à savoir affiché une suite de réels aléatoires donc je pige pas pourquoi ça ne marche pas chez toi...
Partager