2012-02-06 16 views
6

Próbuję zrozumieć, dlaczego za pomocą „/” z long double w następujący sposób prowadzi do wartości 0.000000 podczas gdy ten sam kod z podwójnie nieUżywając "/" z długim podwójnym?

double d = (double)total_results/(double)total_points; 

daje wartość 0.785403 ale

long double d = (long double)total_results/(long double)total_points; 

Podaje wartość 0.000000. Próbuję uzyskać najdokładniejsze wartości dla

EDIT „TOTAL_RESULTS/total_points”: w końcu błąd był po prostu, że jestem wyprowadzanie go za pomocą „% f” zamiast „% LF”

Przed

printf("Running on %d thread(s), results is %f.\n", NUM_THREADS, d);  

Po

printf("Running on %d thread(s), results is %Lf.\n", NUM_THREADS, d); 
+0

co platforma/kompilatora? – CharlesB

+1

Jakie są typy total_results i total_points? Casting ich do 'długi double' może zmienić dostępnego wartość w niewłaściwy sposób – Eregrith

+0

to działa na mnie w C++ –

Odpowiedz

15

jest to oczywiście tylko przypuszczenie, ale jak ty wyprowadzanie wyniki? Jeśli używasz printf z niewłaściwym specyfikatorem pola, drukowanie błędnego zera jest zdecydowanie możliwym wynikiem. Używając g ++, spróbowałem "% lf" i otrzymałem "-2.0000", kiedy powinienem dostać "0,75". Prawo specifier jest "% Lf", z kapitałem L.

+0

Tak, lub '% llf', który również działa. (pod gcc 4.3, przynajmniej Linux) –

+0

To był problem. Używałem "% f". Dziękujemy – Shane

+1

@MrLister: ten komentarz nie jest pomocny; to po prostu uczenie OP ** niewłaściwego ** sposobu zrobienia czegoś i wydaje się, że to działa, kiedy odpowiedź ** right ** została już podana. –

Powiązane problemy