Mi rendo conto che questa domanda potrebbe dipendere dal processore, ma spero che qualcuno possa indicarmi la giusta direzione. Per la vita di me, non riesco a capire come convertire un long long int unsigned che rappresenta i nanosecondi a un double che rappresenta i secondi in C (sto usando un PowerPC 405 big-endian a 32 bit per questo particolare test e un C99 GNU compilatore).Conversione senza firma lunga lunga a doppia in C
ho provato:
unsigned long long int nanoseconds = 1234567890LLU;
double nanoseconds_d = nanoseconds*1e-9;
anche:
nanoseconds_d = ((double) nanoseconds)*1e-9;
Per entrambi i casi, ottengo solo 0. Che cosa sto facendo male qui?
A cura di aggiungere esempio completo
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
unsigned long long int nanoseconds = 1234567890LLU;
double nanoseconds_d = nanoseconds * 1e-9;
printf("%g\n", nanoseconds_d);
return 0;
}
MAKEFILE
SRCS = simple.c
INCLUDE := -I$(PWD)
CFLAGS := -O0 -g3 -Wall -fmessage-length=0 -mhard-float -fsigned-char -D_REENTRANT
LIBS := -lc
OBJS = $(SRCS:.c=.o)
PROG = $(SRCS:.c=).out
all: $(PROG)
$(PROG): $(OBJS)
@echo "Linking object files with output."
$(CC) -o $(PROG) $(OBJS) $(LIBS)
@echo "Linking complete."
$(OBJS): $(SRCS)
@echo "Starting compilation."
$(CC) $(CFLAGS) $(INCLUDE) -c $<
@echo "Compilation complete."
clean::
@$(RM) *.o *.out
Funziona bene qui. Qual è il valore senza senso e come lo stai stampando? –
Potrebbe essersi imbattuto in un bug del compilatore. La conversione di un valore senza segno a 64 bit in 'double' sarebbe eseguita con una sequenza di istruzioni diverse (al contrario di una sola) e questa sequenza poco utilizzata sarebbe errata in almeno alcuni casi per il compilatore. Come prova/soluzione, prova a sommare i risultati di due conversioni a 32 bit -> doppio. –
Pascal, penso che tu stia facendo qualcosa. Funziona bene se sommi due input lunghi e poi converto in double. – shansen