2012-02-06 3 views
6

Я пытаюсь понять, почему использование «/» с длинным двойным следующим образом приводит к значению 0,000000, а тот же код с двойной неИспользование '/' с длинным двойным?

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

дает значение 0.785403 но

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

Дает значение 0.000000. Я пытаюсь получить наиболее точное значение

EDIT «total_results/total_points»: В конце концов ошибка была просто, что я выводящий его с помощью «% F» вместо «% Lf»

Перед

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

После

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

какая платформа/компилятор? – CharlesB

+1

Каковы типы total_results и total_points? Приведение их к 'long double' может неправильно изменить доступное значение – Eregrith

+0

Это работает для меня на C++ –

ответ

15

Это, очевидно, только предположение, но, как вы вывода результатов? Если вы используете printf с неправильным спецификатором поля, печать ошибочного нуля определенно является возможным результатом. Используя g ++, я попробовал «% lf» и получил «-2.0000», когда я должен был получить «0.75». Правильный спецификатор - «% Lf», с капиталом L.

+0

Да, или '% llf', это тоже работает. (по gcc 4.3, Linux по крайней мере) –

+0

В этом была проблема. Я использовал «% f». Спасибо – Shane

+1

@MrLister: Этот комментарий не поможет; это просто обучает OP ** неправильному ** способу сделать что-то и, похоже, это работает, когда уже был дан ** правильный ** ответ. –

Смежные вопросы