Analyse de la saisie de l'utilisateur à l'aide de Time_T
Question
Mon idée est, si l'utilisateur entre t = 2.5
, puis j'extrait 2 et 0,5 séparément dans 2 variables différentes. Mais je ne peux pas faire ça.
Voici le code:
$ export LT_LEAK_START=1.5
$ echo $LT_LEAK_START
1.5
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
double d;
time_t t;
long nsec;
d=strtod(getenv("LT_LEAK_START"), NULL);
t=(time_t)d;
nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
printf("d = %lf\n",d);
printf("t = %u, nsec = %f\n",d,nsec);
}
La sortie est:
# ./a.out
d = 1.500000
t = 0, nsec = 0.000000
La solution
Votre sortie est cassée. Vous écrivez réellement la valeur de d
Deux fois dans le code suivant:
nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
printf("d = %lf\n",d);
printf("t = %u, nsec = %f\n",d,nsec);
Si vous avez écrit ceci:
nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
printf("d = %lf\n",d);
printf("t = %u, nsec = %f\n",t,nsec);
Ensuite, vous auriez la sortie:
d = 1.500000
t = 1, nsec = 0.000000
Il est maintenant plus clair que vous avez une erreur d'arrondi. Dans ce cas, vous jetez toutes les décimales en attribuant 0,5 à nsec
, un long
. Faire, construire nsec
un float
Au lieu.
Autres conseils
Vous essayez également de stocker une valeur fractionnaire depuis longtemps. Vous devez soit multiplier cela par 1000 ou faire nsec
un double.
nsec=d-(double)((time_t)d);
Si D est 1,5, le résultat du côté droit serait de 0,5, ce qui allait implicitement baisser à 0 lorsqu'il sera stocké dans NSEC.
Vous essayez d'attribuer .5
à un long
ce qui ne va pas arriver.
double d = 1.5;
int i = (int)d;
double j = d - (double)i;
printf("%d %f\n",i,j);