2013-05-23 14 views
5

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

Funziona bene qui. Qual è il valore senza senso e come lo stai stampando? –

+3

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

+0

Pascal, penso che tu stia facendo qualcosa. Funziona bene se sommi due input lunghi e poi converto in double. – shansen

risposta

1

lavora qui quando si utilizza %g stampare

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

uscite

1.23457 
1.23457 
+0

Ho appena copiato e incollato il codice e ottengo 0 per entrambi i casi! Strano ... – shansen

0

Si scopre che la versione di cross gcc I in uso aveva un bug che aveva a che fare con il punto di virgola mobile soft vs. hard. Pertanto, il cast da unsigned long long a double non funzionava correttamente, causando il problema.

+3

Quale versione di gcc hai riscontrato questo errore? – Patrick

Problemi correlati