Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
PoMa_HaB
13 / 13 / 3
Регистрация: 09.01.2013
Сообщений: 78
#1

Насчёт числа знаков после запятой - C++

11.01.2013, 21:54. Просмотров 3786. Ответов 32
Метки нет (Все метки)

Вот например у меня массив с числами, у которых по 5 знаков после запятой. Как мне (с помощью какой функции или операции) сделать так чтобы у этих чисел, было по 3 знака после запятой двумя способами (сначала округлялось, а вторым способом не округлялось до тысячной. Заметьте мне надо чтобы значение чисел стало таким, а не просто показывалась тысячная доля. Например такие функции как cout.precision и printf мне не помогут.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Насчёт числа знаков после запятой (C++):

Округление числа до двух знаков после запятой - C++
8. Написать программу, которая предлагает пользователю ввести дробное число, округляет его до двух знаков после запятой и выводит результат...

Функция round(), округление числа до 4-х знаков после запятой - C++
Вот наткнулся на проблемку как округлить число до 4 знаков после запятой? Подскажите что делать?

Точность в N знаков после запятой числа типа double - C++
Добрый день, уважаемы форумчане! Возникла проблема, заключающаяся в изменении значения, получающегося в результате выполнения функции...

Вывод числа с ограниченным количеством знаков после запятой - C++
float m; m = (6.0221412927*pow(10,23.0))/23; cout <<"Количество атомов в 1 мг Натрия = "<<m<<endl<<endl; Как...

Округление числа в строке до указанного количества знаков после запятой - C++
Как делать округление в строке, до знака после запятой порядковый номер который задаёт пользователь с клавиатуры

Число знаков после запятой - C++
Никогда не задумывался, но можно-ли ограничить число знаков во флоате, не для вывода, а для рассчетов?

32
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
12.01.2013, 23:58 #16
Цитата Сообщение от PoMa_HaB Посмотреть сообщение
Avazart, Почему глупо??? Может передо мной такая задача стоит? У меня метод простой итерации и нужно округлять результаты решений системы.
Вот и я говорю задача - глупая ... глупо терять точность...

Цитата Сообщение от PoMa_HaB Посмотреть сообщение
p.s. а насчёт мусора, тогда весь форум получается в мусоре. Раз на то дело пошло отвечайте всем так: "Читайте книги по программированию" и т.д. и т.п.
Я кинул конкретную статью для начинающих ( блог) при чем тут книги ?
0
PoMa_HaB
13 / 13 / 3
Регистрация: 09.01.2013
Сообщений: 78
13.01.2013, 00:06  [ТС] #17
Цитата Сообщение от Avazart Посмотреть сообщение
Вот и я говорю задача - глупая ... глупо терять точность...
Ну это вы скажите авторам книг по вычислительным методам...
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 00:08 #18
Ну вот началось: " Я Дартаньян, писатели книг - 3.14..."

Более чем уверен что вам нужно не округление, а сравнение этих чисел с заданной точностью ...

Тобишь

C++
1
2
3
4
float a,b;
const float e= 10e-10;
//...
if ( fabs(a - b) < e ) { / * Ура это решение !!! */ };
1
PoMa_HaB
13 / 13 / 3
Регистрация: 09.01.2013
Сообщений: 78
13.01.2013, 00:42  [ТС] #19
Цитата Сообщение от Avazart Посмотреть сообщение
Ну вот началось: " Я Дартаньян, писатели книг - 3.14..."

Более чем уверен что вам нужно не округление, а сравнение этих чисел с заданной точностью ...

Тобишь

C++
1
2
3
4
float a,b;
const float e= 10e-10;
//...
if ( fabs(a - b) < e ) { / * Ура это решение !!! */ };
Этот принцип не работал у меня, а вот то что в этой теме мне очень даже помогло. И вуаля, программа работает и останавливается на нужной точности... Мне кажется можно закрыть эту тему и остановить дискуссию
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 00:54 #20
Цитата Сообщение от Deviaphan Посмотреть сообщение
Говори правильно: "Никто не пишет на Билдере".
Не все умеют
0
0x10
13.01.2013, 07:16
  #21

Не по теме:

Цитата Сообщение от PoMa_HaB Посмотреть сообщение
Этот принцип не работал у меня
Если была проблема в сравнении чисел с плавающей точкой, то эту проблему и нужно было решать - вероятно, были ошибки в реализации. Вы же придумали совсем другую сомнительную задачу и потратили на нее время и силы.

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.01.2013, 07:18 #22
Цитата Сообщение от PoMa_HaB Посмотреть сообщение
Этот принцип не работал у меня
Значит, где-то была ошибка реализации. Потому что именно так и делается. Ведь не "округляется решение", а "ищется решение с заданной точностью".


Цитата Сообщение от Avazart Посмотреть сообщение
глупо терять точность...
Тогда выкинь float и всегда и везде используй double, ведь глупо терять точность. А ещё лучше, используй BCD числа, чтобы уж наверняка в точности не потерять...
0
PoMa_HaB
13 / 13 / 3
Регистрация: 09.01.2013
Сообщений: 78
13.01.2013, 12:41  [ТС] #23
Цитата Сообщение от 0x10 Посмотреть сообщение
Если была проблема в сравнении чисел с плавающей точкой, то эту проблему и нужно было решать - вероятно, были ошибки в реализации. Вы же придумали совсем другую сомнительную задачу и потратили на нее время и силы.
Дело опять же не только в решении проблемы сравнения, а я для себя хотел узнать как присвоить значение тому или иному числу с определённой точностью..


Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда выкинь float и всегда и везде используй double, ведь глупо терять точность. А ещё лучше, используй BCD числа, чтобы уж наверняка в точности не потерять...
+1
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 16:15 #24
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда выкинь float и всегда и везде используй double, ведь глупо терять точность. А ещё лучше, используй BCD числа, чтобы уж наверняка в точности не потерять..
Не выкидывайте контекст, глупо пытаться округлить теряя при этом точность, а не использовать float.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.01.2013, 16:57 #25
Цитата Сообщение от Avazart Посмотреть сообщение
глупо пытаться округлить теряя при этом точность
Реальная ситуация. Нужно было собрать сеточную модель из списка разрозненных треугольников. При этом координаты вершин должны быть заданны с определённой точностью. Генератор объёмной сетки выдавал координаты треугольников на три порядка точнее необходимого. Поэтому сперва точные координаты пришлось округлять до заданной точности, и только потом уже "склеивать" модель из треугольника с округлёнными координатами. Полученная сетка подвергалась обработке сторонней программы. которая была ограничена в точности и если подавать сырые координаты, то результат работы оказывался либо хуже, либо вообще программа падала (из-за неожиданного округления объём, ограниченный сеткой, оказывался не замкнутым или самопересекающимся).
Это я всё к чему... Не стоит категорически утверждать о глупости некоего действия, если в некоторых ситуациях оно необходимо.)
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 17:03 #26
Так что проблема в большей точности ?

Цитата Сообщение от Deviaphan Посмотреть сообщение
Поэтому сперва точные координаты пришлось округлять до заданной точности, и только потом уже "склеивать" модель из треугольника с округлёнными координатами.
Ну это, как я понимаю, уже вывод...

Цитата Сообщение от Deviaphan Посмотреть сообщение
Полученная сетка подвергалась обработке сторонней программы. которая была ограничена в точности
Так о чем речь если проблема в сторонней программе ?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.01.2013, 17:19 #27
Цитата Сообщение от Avazart Посмотреть сообщение
Так о чем речь если проблема в сторонней программе ?
Речь о том, что сторонняя программа работала с числами до е-6, а исходные данные были е-9. И программа их не округляла, а усекала. Из-за чего случались эпик фэйлы. И проблемы сторонних библиотек зачастую приходится решать пользователям этих программ, а не сторонним разработчикам.(


Цитата Сообщение от Avazart Посмотреть сообщение
Ну это, как я понимаю, уже вывод...
Нееее, это только "вход".


Скажем иначе. Если бы не было необходимости в округлении чисел, то в стандартной библиотеки не было бы функций floor и ceil. А раз они есть, то более чем одному разработчику требовалось округление.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 17:33 #28
Цитата Сообщение от Deviaphan Посмотреть сообщение
Нееее, это только "вход".
Ну тогда могу лишь повторить что это глупо, к погрешности представления float вы добавляете погрешность при округлении и хорошо если погрешности компенсируют друг друга а что если нет ?
( к тому же все равно данные будут в том виде что позволит float т.е опять таки в 0.9999999... или 1.000001 )

Цитата Сообщение от Deviaphan Посмотреть сообщение
Речь о том, что сторонняя программа работала с числами до е-6, а исходные данные были е-9. И программа их не округляла, а усекала. Из-за чего случались эпик фэйлы. И проблемы сторонних библиотек зачастую приходится решать пользователям этих программ, а не сторонним разработчикам.(
Ну так тут именно вывод ( вашей программы ), а тут собственно и
Цитата Сообщение от PoMa_HaB Посмотреть сообщение
cout.precision и printf мне не помогут.
справятся...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.01.2013, 17:37 #29
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так тут именно вывод ( вашей программы )
Не-не-не. Моя программа даёт данные той программе. которая давала данные моей...
Пофиг.)))
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,794
Записей в блоге: 17
13.01.2013, 17:40 #30
Цитата Сообщение от Deviaphan Посмотреть сообщение
Пофиг.)))
Именно по тому что это логический "конец" вашей программы ...

И данные будут представлены в том виде котором они могут быть восприняты,
а не в том котором лучше их хранить (в плане наибольшей точности) - т.е. выход.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 17:40
Привет! Вот еще темы с ответами:

Количество знаков после запятой - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { float g = 10.53446; printf(&quot;%.4f\n&quot;, g); ...

Вывести n знаков после запятой - C++
Всем привет, не знаю как через cout вывести 8 знаков после запятой. Заранее спасибо

Количество знаков после запятой - C++
После запятой нужно всешжа показывать определенные число знаков, например шесть: 263.000000 Иными словами, даже если там нули ...

Вывод n знаков после запятой - C++
Как это сделать?


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
13.01.2013, 17:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru