Domanda

La mia idea è che se l'utente entra t = 2.5, quindi estrai 2 e 0,5 separatamente in 2 variabili diverse. Ma non sono in grado di farlo.

Ecco il codice:

$ 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);
}

L'output è:

# ./a.out 
  d = 1.500000
  t = 0, nsec = 0.000000
È stato utile?

Soluzione

Il tuo output è rotto. Stai effettivamente scrivendo il valore di d due volte nel seguente codice:

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);

Se avessi scritto questo:

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);

Allora avresti l'output:

d = 1.500000
t = 1, nsec = 0.000000

Ora è più chiaro che hai un errore di arrotondamento. In questo caso, hai gettato via tutti i luoghi decimali assegnando 0,5 a nsec, un long. Fare nsec un float invece.

Altri suggerimenti

Stai anche cercando di archiviare un valore frazionario a lungo. È necessario moltiplicarlo per 1000 o fare nsec un doppio.

nsec=d-(double)((time_t)d);

Se D è 1,5, il risultato del lato destro sarebbe 0,5, che implicirà implicitamente a 0 quando verrà immagazzinato in NSEC.

Stai cercando di assegnare .5 a a long che non succederà.

double d = 1.5;
int i = (int)d;
double j = d - (double)i;

printf("%d %f\n",i,j);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top