Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > double округление |
Автор: Lycifer 5.5.2008, 12:57 |
#include <iostream> [/color] using namespace[/color] std; int main(int argc, char* argv[]) { double doubleVar = 123.456; doubleVar+=0.000789; cout<< doubleVar<<endl; for (int i=0; i<2; i++) { doubleVar=doubleVar/10; } cout<< doubleVar<<endl; } Результат: 123.457 1.23457 а должен быть: 123.45789 1.2345789 вопрос как с этим боротся? |
Автор: Igor_K 5.5.2008, 13:21 | ||
Попробуй перед выводом написать
По умолчанию выводит только 6 Тут ты установиш 10 |
Автор: Lycifer 5.5.2008, 13:42 |
double doubleVar = 123.000; cout.precision(30); cout<<doubleVar/10<<endl; Результат: 12.3000000000001 Как с этим боротся? |
Автор: Igor_K 5.5.2008, 13:54 |
Lycifer, ты на счет единицы в конце числа? |
Автор: bsa 5.5.2008, 14:04 |
Lycifer, ты почитай теорию относительно вещественных типов. Тогда может быть поймешь, что выводить с точностью выше допустимой для типа совершенно бесполезно. Кстати, можешь еще попробовать тип long double. |
Автор: Lycifer 5.5.2008, 14:22 |
Я понемаю что количество разрядов... бла, бла Просто дело в том что надо как-то это решить(задача такова), есть конечно способ что создать умный класс... но производительность будет просто удачная |
Автор: bsa 5.5.2008, 14:55 |
Lycifer, тебе какая точность нужна (сколько значащих разрядов)? |
Автор: Lycifer 5.5.2008, 15:56 |
Дело в том что происходит расчёт (sin(n)+sin(n+1)/cos(n)+cos(n+1) и так далее.. ещё там умножение), так что точное количество не знаю, думаю 15 знаков после точки хватит |
Автор: bsa 5.5.2008, 16:54 |
Lycifer, тебе какая точность нужна, а не сколько после точки! Это разные вещи. У чисел 123.0, 0.00005434 и 0.1234 точность одинаковая - 4 знака: 1.230e3 5.434e-5 1.234e-1 То что после "e" - это экспонента и на точность она не влияет. Добавлено через 3 минуты и 6 секунд и вообще, setprecision отвечает за вывод числа, а не за расчеты. |
Автор: Lycifer 5.5.2008, 17:34 |
setprecision - насчёт этого так я отвеяал Igor K. А вот на счёт точности так это m.000000000000001 |
Автор: baldina 16.5.2008, 15:15 | ||
Так ты объясни (и сам пойми) с чем ты бороться хочешь? Если надо выводить сколько-то значащих - тебе ответили. Если тебя смущает неточность числа - с этим придется мириться, т.к. бесконечное множество действительных чисел отображается на конечное множество чисел, представимых в ЭВМ. 12.3 точно представить нельзя - либо 12.3000000000001 либо 12.9999999999999. Потому и используются "только-то значащих цифр", что точность вычислений ограничена. Если возьмешь float, будет еще хуже ![]() |