Russian Qt Forum
Ноябрь 23, 2024, 20:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Трабла с double.  (Прочитано 6036 раз)
alexman
Гость
« : Октябрь 06, 2011, 18:36 »

Вот код:
Код:
const double max = 673271033142181888.000000;
const double left = -976.233463;
const double min = -673271033142181888.000000;
const double right = max - (left - min);
qDebug() << QString("%1").arg(right, 0, 'f');
Выводит "1024", а должно "976.233463". Что за фигня?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Октябрь 06, 2011, 19:00 »

Потеря точности при вычислении.
Записан
alexman
Гость
« Ответ #2 : Октябрь 06, 2011, 19:02 »

Понятно что потеря. Че делать то (кроме деления на 10^x)?
Записан
Pretorean
Гость
« Ответ #3 : Октябрь 07, 2011, 09:24 »

Понятно что потеря. Че делать то (кроме деления на 10^x)?
используй другой тип данных
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Октябрь 07, 2011, 10:06 »

Че делать то (кроме деления на 10^x)?
Вычислять right как right = max + min - left;  Подмигивающий
А вообще:
1) вычислять без значительной потери точности;
2) не использовать разный порядок операций в одних и тех же формулах в зависимости от значений (порядка значений) аргументов
3) использовать арифметику с плавающей точкой
Выбирайте любые 2.
Записан
alexman
Гость
« Ответ #5 : Октябрь 07, 2011, 11:14 »

Понятно что потеря. Че делать то (кроме деления на 10^x)?
используй другой тип данных
Какой?
Записан
alexman
Гость
« Ответ #6 : Октябрь 07, 2011, 11:17 »

Цитировать
1) вычислять без значительной потери точности;
2) не использовать разный порядок операций в одних и тех же формулах в зависимости от значений (порядка значений) аргументов
Не понятно?

Цитировать
3) использовать арифметику с плавающей точкой
Выбирайте любые 2.
При переходе на float потеря точности произойдет!
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Октябрь 07, 2011, 12:10 »

При переходе на float потеря точности произойдет!
Да, float тоже тип с плавающей точкой.

Не понятно
Выбирайте любые 2 значит, что для 2 из 3 требований решение найти можно. Для всех 3 - едва ли.

Выбираем 1 и 2, отказываемся от 3.
Т.е. отказываемся от типов с плавающей точкой (float, real, double...) и используем (или пишем сами) библиотеку для работы с числами произвольной точности.
http://ru.wikipedia.org/wiki/%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0

Выбираем 1 и 3, отказываемся от 2.
Надо думать в каком порядке производить действия.
Например для
const double max = 673271033142181888.000000;
const double left = -976.233463;
const double min = -673271033142181888.000000;
const double right = max + min - left;

А для
const double max = 976.233463;
const double left = 673271033142181888.000000;
const double min = -673271033142181888.000000;
const double right = max - (left - min);

Выбираем 2 и 3, отказываемся от 1.
Самый простой вариант. Веселый
Соглашаемся на потерю точности. Ну 1024 вместо 976.233463 и 1024.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 07, 2011, 14:40 »

Выводит "1024", а должно "976.233463". Что за фигня?
Ну можно долго пояснять что, мол, "все работает в определенных пределах", "не существует задачи без ограничений" и.т.д и.т.п., но лучше просто полагать что все достаточно грамотны и по крайней мере слышали что такое характеристика и мантисса.

Поэтому если стоит задача работать с такими большими числами - то надо так в теме и говорить, и то уже др. разговор. А если такой необходимости нет - то скромно уменьшить пределы, учитывая что возводить число в квадрат почти всегда придется.

А пока "фигня у коня"  Улыбающийся
Записан
alexman
Гость
« Ответ #9 : Октябрь 07, 2011, 15:43 »

Всем спасибо! По ходу надо использовать либу для работы с большими числами, так как точность важна и большие числа это нормальная ситуация в моем случае! Вариант с перестановкой слагаемых не катит (это лишь один пример)  Грустный Тогда другой вопрос: посоветуйте хорошую либу для данных целей и что происходит с производительностью?
Записан
SASA
Гость
« Ответ #10 : Октябрь 08, 2011, 12:34 »

Например, http://citkit.ru/package/gmp/
Сам не пробовал. Если подключишь - опиши процесс.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 23.