Rozumiem, że to pytanie może być zależne od procesora, ale mam nadzieję, że ktoś może wskazać mi właściwy kierunek. Dla mojego życia, nie mogę wymyślić, jak przekonwertować unsigned long long int reprezentujący nanosekundy do podwójnego oznaczającego sekundy w C (używam 32-bitowego high-endian PowerPC 405 do tego konkretnego testu, a GNU C99 kompilator).Konwertuj unsigned long long to double in C
Próbowałem:
unsigned long long int nanoseconds = 1234567890LLU;
double nanoseconds_d = nanoseconds*1e-9;
również:
nanoseconds_d = ((double) nanoseconds)*1e-9;
W obu przypadkach, po prostu dostać 0. Co robię źle tutaj?
edytowane Dodaj pełny PRZYKŁAD
#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
Działa dobrze tutaj. Jaka jest wartość bzdur i jak ją drukujesz? –
Mogłeś natknąć się na błąd kompilatora. Konwersja 64-bitowej niepodpisanej wartości na "podwójne" zostanie wykonana za pomocą sekwencji kilku instrukcji (w przeciwieństwie do jednej), a ta mało używana sekwencja byłaby błędna przynajmniej w niektórych przypadkach dla kompilatora. Jako test/obejście, spróbuj podsumować wyniki dwóch konwersji 32-bitowe -> podwójne. –
Pascal, myślę, że coś knujesz. Działa to dobrze, jeśli zsumuję dwa długie ints, a następnie zmienię na double. – shansen