Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Попробуй перед выводом написать
Код

 cout.precision(10);


По умолчанию выводит только 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.3000000000001

Как с этим боротся? 

Так ты объясни (и сам пойми) с чем ты бороться хочешь? Если надо выводить сколько-то значащих - тебе ответили. Если тебя смущает неточность числа - с этим придется мириться, т.к. бесконечное множество действительных чисел отображается на конечное множество чисел, представимых в ЭВМ. 12.3 точно представить нельзя - либо 12.3000000000001 либо 12.9999999999999. Потому и используются "только-то значащих цифр", что точность вычислений ограничена. Если возьмешь float, будет еще хуже  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)