Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> double округление, double округляет и из-за этого не то зна 
:(
    Опции темы
Lycifer
Дата 5.5.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



#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
вопрос как с этим боротся?
PM MAIL ICQ   Вверх
Igor_K
Дата 5.5.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Попробуй перед выводом написать
Код

 cout.precision(10);


По умолчанию выводит только 6 
Тут ты установиш 10
PM MAIL   Вверх
Lycifer
Дата 5.5.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



double doubleVar = 123.000;
    
cout.precision(30);
    cout<<doubleVar/10<<endl;

Результат:
12.3000000000001

Как с этим боротся?
PM MAIL ICQ   Вверх
Igor_K
Дата 5.5.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Lycifer, ты на счет единицы в конце числа?
PM MAIL   Вверх
bsa
Дата 5.5.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lycifer, ты почитай теорию относительно вещественных типов. Тогда может быть поймешь, что выводить с точностью выше допустимой для типа совершенно бесполезно. Кстати, можешь еще попробовать тип long double.
PM   Вверх
Lycifer
Дата 5.5.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Я понемаю что количество разрядов... бла, бла
Просто дело в том что надо как-то это решить(задача такова), есть конечно способ что создать умный класс... но производительность будет просто удачная
PM MAIL ICQ   Вверх
bsa
Дата 5.5.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lycifer, тебе какая точность нужна (сколько значащих разрядов)?
PM   Вверх
Lycifer
Дата 5.5.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Дело в том что происходит расчёт (sin(n)+sin(n+1)/cos(n)+cos(n+1) и так далее.. ещё там умножение), так что точное количество не знаю,  думаю 15 знаков после точки хватит

PM MAIL ICQ   Вверх
bsa
Дата 5.5.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lycifer, тебе какая точность нужна, а не сколько после точки! Это разные вещи.
У чисел 123.0, 0.00005434 и 0.1234 точность одинаковая - 4 знака:
1.230e3
5.434e-5
1.234e-1
То что после "e" - это экспонента и на точность она не влияет.

Добавлено через 3 минуты и 6 секунд
и вообще, setprecision отвечает за вывод числа, а не за расчеты.
PM   Вверх
Lycifer
Дата 5.5.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



setprecision - насчёт этого так я отвеяал Igor K.
А вот на счёт точности так это m.000000000000001
PM MAIL ICQ   Вверх
baldina
Дата 16.5.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

Результат:
12.3000000000001

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

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

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.