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
Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top