2013-05-23 24 views
5

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 
+2

Działa dobrze tutaj. Jaka jest wartość bzdur i jak ją drukujesz? –

+3

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. –

+0

Pascal, myślę, że coś knujesz. Działa to dobrze, jeśli zsumuję dwa długie ints, a następnie zmienię na double. – shansen

Odpowiedz

1

tu pracuje przy użyciu %g wydrukować

#include <stdlib.h> 
#include <stdio.h> 

int main(){ 
    unsigned long long int nanoseconds = 1234567890LLU; 
    double nanoseconds_d = nanoseconds*1e-9; 
    printf("%g\n", nanoseconds_d); 

    nanoseconds_d = ((double) nanoseconds)*1e-9; 
    printf("%g\n", nanoseconds_d); 
} 

wyjść

1.23457 
1.23457 
+0

Właśnie skopiowałem i wkleiłem twój kod, a otrzymam 0 dla obu przypadków! Dziwne ... – shansen

0

Okazuje się, że wersja cross gcc, z której korzystałem, miała błąd związany z płynnym lub twardym zmiennoprzecinkowym punktem. Dlatego rzutowanie z unsigned long long na double nie działa poprawnie, powodując problem.

+3

Którą wersję gcc doświadczyłeś tego błędu? – Patrick