0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
1

Округление Double

05.04.2016, 15:46. Показов 2776. Ответов 16
Метки нет (Все метки)

Использую Double, возникают при тонких расчетах проблемы с округлением.
Какие есть стандартные способы решения?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2016, 15:46
Ответы с готовыми решениями:

Округление double
Добрый день. Происходит округление double. На каком этапе это происходит на данный момент я не могу...

Округление double
Короче ввожу число 1.05 в Debug показывает его, как 1.004999999999999999995663191310058 вот как...

Округление Long double.
Нужно округлить число типа long double в меньшую сторону т.е. просто обнулить всю дробную часть, но...

Убрать округление double
Доброго времени суток! Недавно начав самостоятельно изучать С++, я пыталась выполнить лабораторную...

16
18 / 18 / 16
Регистрация: 17.08.2015
Сообщений: 125
05.04.2016, 16:06 2
double округление с точность до N знаков
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
05.04.2016, 16:38 3
C++
1
cout<< 1234.56789 << ‘’\t(общий)\t” <<fixed<< 1234.56789 << “\t(фиксированный)\t” <<scientific<< 1234.56789 << “\t(научный)\n”;
Результат:1234.57 (общий) 1234.567890 (фиксированный) 1.234568e+003 (научный)
Манипуляторы fixedи scientificявляются персистентными.

C++
1
2
3
4
5
6
inlineios_base&general(ios_base&b) // фиксированный и научный формат 
// сбрасывает все флаги формата с плавающей точкой
{
        b.setf(ios_base::fmtflags(0), ios_base::floatfield);
        returnb;
}
Теперь general является персистентным манипулятором с плавающей точкой.
Формат чисел с плавающей точкой:
fixed использовать представление с фиксированной точкой
scientific использовать мантиссу и показатель степени; мантисса всегда лежит в диапазоне [1:10), т.е. перед десятичной всегда стоит ненулевая десятичная цифра

Добавлено через 1 минуту
По умолчанию число с плавающей точкой выводится на печать с помощью шести цифр в формате general, т.е.:
1234.567 выводится как 1234.57, 1.2345678 выводится как 1.234567.
Ostream не может вывести число 1234567.0 как fixed (выводит 6 цифр). Он переключается в формат scientific.
Можно установить точность представления числа, используя манипулятор setprecision().
C++
1
2
3
cout<< 1234.56789 << ‘\t’ << fixed << 1234.56789 << ‘\t’ << scientific << 1234.56789 << ‘\n’;
cout<< general <<setprecision(5) << 1234.56789 <<‘\t’<< fixed<< 1234.56789 <<‘\t’ << scientific << 1234.56789 <<‘\n’;
cout<< general <<setprecision(8) << 1234.56789 <<‘\t’<< fixed<< 1234.56789 <<‘\t’ << scientific << 1234.56789 <<‘\n’;
Результат: 1234.57 1234.567890 1.234568e+003
1234.6 1234.56789 1.23457e+003
1234.5679 1234.56789000 1.23456789e+003
Точность чисел с плавающей точной:
general точность определяет общее количество цифр
scientific точность определяется количеством цифр после десятичной точки
fixed точность определяется количеством цифр после десятичной точки
0
С чаем беда...
Эксперт CЭксперт С++
10001 / 5350 / 1464
Регистрация: 18.10.2014
Сообщений: 12,897
05.04.2016, 18:46 4
Цитата Сообщение от FortranDLL Посмотреть сообщение
Использую Double, возникают при тонких расчетах проблемы с округлением.
Какие есть стандартные способы решения?
Решения чего? Каких проблем? Вам мешает округление? Или наоборот, у вас не получается сделать округление? Потрудитесь изъясняться осмысленнее.
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
05.04.2016, 18:58  [ТС] 5
У меня сравниваются две переменные (Double), которые близки.
Есть подозрения что численная часть работает не совсем корректно из-за того, что в силу округления знак (сравнения) может маргиналить.
Вот я думаю, как бы этой малой кровью проверить?
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
05.04.2016, 19:19 6
Что за знак сравнения?
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
05.04.2016, 19:53  [ТС] 7
C++
1
if (a >= b)
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
05.04.2016, 19:55 8
Проверяй не на точное равенство, а с допустимой погрешностью.
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
05.04.2016, 20:07  [ТС] 9
Ну вообще так и реализовано.
На самом деле проверяется a+epsilon >= b.
Проблема в том, что по другим причинам epsilon надо уменьшить.
И вот тут когда сильно его уменьшаешь происходят глюки
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
05.04.2016, 20:55 10
Может, точности double не хватает?
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
05.04.2016, 20:57  [ТС] 11
Наверное, да. И что тогда делать?
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
05.04.2016, 21:08 12
Алгоритм оптимизировать, наверное. Сложно сказать. Тебе виднее.
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
05.04.2016, 21:26  [ТС] 13
Так если точности double не хватает, там выше писали про scientific - есть шанс что это поможет?
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
06.04.2016, 10:13 14
Выше писали про способы форматирования вывода, а у тебя, если я правильно понял, проблема при сравнении.
0
0 / 0 / 1
Регистрация: 05.03.2014
Сообщений: 94
06.04.2016, 12:13  [ТС] 15
Есть некий массив данных. С ним проводятся некие манипуляции.
И в конце получаются два числа, которые надо сравнить.
Есть ли какой-то способ (простой) увеличить точность (например, больше знаков использовать после запятой во всех операциях)?
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
06.04.2016, 12:34 16
Цитата Сообщение от FortranDLL Посмотреть сообщение
Есть ли какой-то способ (простой) увеличить точность
double -> long double
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
06.04.2016, 15:28 17
long double даст не очень большое увеличение точности и, в зависимости от компилятора, может быть синонимом double.
Какие именно величины у тебя там? Пример.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 15:28
Помогаю со студенческими работами здесь

double округление с точность до N знаков
Добрый день, помогите пожалуста какую надо использовать функцию чтобы была возможность округлить...

Форматирование вывода и округление double
Доброго времени суток. Я много подобных тем полистал. Но не нашел ответа. Мне нужно написать...

printf. Округление чисел типа double
Пытаюсь писать программу для округления чисел типа double. // okruglenie double.cpp: определяет...

Округление числа double до десятых, до сотых
Приветствую всех, double y=3.1415; нужно округлить y до десятых и сотых, записать в переменные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru