4 / 4 / 0
Регистрация: 25.06.2010
Сообщений: 106
|
||||||
1 | ||||||
непонятки02.08.2011, 13:40. Показов 6865. Ответов 81
Метки округление (Все метки)
у меня есть прога которая берет дабл и разделяет его на две сост. целое и дробное
0
|
02.08.2011, 13:40 | |
Ответы с готовыми решениями:
81
непонятки с for непонятки с Си Непонятки с WXDev C++ Непонятки с итераторами |
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
02.08.2011, 23:23 | 42 |
Конечно будет. Замените int на int64_t, чтобы ни о чём плохом не думать... Задача-то, на сколько я понял, выдать по отдельности целыми числами целую и дробную части. У меня как-раз это и происходит (при учёте, что и та и другая помещаются в INT_MAX (INT_MIN)), а у Вас?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
02.08.2011, 23:51 | 43 |
Беда-то в том, что я смогу ответить на вопрос почему именно 0.5, а вот сможешь ли ты убедительно ответить почему именно 10^-5? Почему не 0.001 или 0.000001? Ответ "потому что и так работает" выглядит слабо.
Кстати, pow(0.1,4) это не 10^-5
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
03.08.2011, 00:36 | 45 |
Потому, что это верхняя граница абсолютного значения ошибки представления целого числа, которую ещё можно исправить. И способ её исправления — округление до ближайшего целого.
То есть если известно, что число должно быть целым, то если истинная ошибка по модулю меньше 0.5, то достаточно просто округлить к ближайшему целому. Если ошибка больше, то её не исправить. Алгоритм округления я показывал в функции: Если число положительное, то надо добавить 0.5 и округлить к минус бесконечности (floor). Если число отрицательное, то надо вычесть 0.5 и округлить к плюс бесконечности (ceil).
1
|
easybudda
|
03.08.2011, 00:42
#47
|
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
03.08.2011, 01:00 | 48 |
Для тех, кто на бронепоезде
До ближайшего целого. Этому в школе учат. 23.71 округляется до 24, 23.1 округляется до 23 23.5 округляется до 24 23.499 округляется до 23 -17.6 округляется до -18 -17.3 округляется до -17 -17.5 округляется до -18 -17.49 округляется до -17 Это называется до ближайшего целого. Добавлено через 13 минут Согласен, предложение сложное. Так бывает. Дробные числа хранятся в памяти в усечённом виде, так как нет способа представить абсолютно любую дробь конечным количеством битов. Поэтому после умножения, к примеру, 0.11 на 100 мы получим не точно 11, а число близкое к 11, с некоторой ошибкой. Это не вызывает несогласия? Ошибка может быть как положительной, так и отрицательной. Кроме того, поскольку 0.11 получается у нас в результате вычитания (когда целую часть отнимаем), то ошибка эта может быть довольно существенной. В общем случае чем больше по модулю целая часть, тем больше будет модуль возможной ошибки. В результате вместо 11 у нас может получится, к примеру, 11.07 или может 10.95, или ещё какое. Конечно, для получения настолько большой ошибки разрядности int в 32 бита не хватит, но можно ведь и более вместительный тип взять. Так вот, пока модуль ошибки меньше чем 0.5, эту ошибку можно полностью устранить. Округлением до ближайшего целого.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
||||||
03.08.2011, 01:17 | 50 | |||||
0
|
grizlik78
|
03.08.2011, 01:18
#51
|
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
03.08.2011, 01:20 | 53 |
easybudda, а зачем правые нули удаляешь? Они же значащие при заданной разрядности.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
03.08.2011, 01:30 | 54 |
Да чёрт его знает. Мне так красивше показалось, когда 3.05 раскладывается на 3 и 5, а не на 3 и 50. Может оно и не правильно...
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
03.08.2011, 01:32 | 55 |
Красивше, да
Но семантика-то у них 3 целых и 50 тысячных. Про то что 50 тысячных стали 5-ю сотыми из вывода уже не понять.
0
|
Заблокирован
|
|||||||||||
03.08.2011, 09:11 | 56 | ||||||||||
А теперь внимание сюрприз
Далее int64 9223372036854775807 double 1.79769e+308 Рассмотрим случай - я програмно ввёл целую часть 9223372036854775890 - и что тогда??? А если введу только целую часть 1.79769e+308, к какому тогда типу приводить будешь???Я пытался тебе показать что если есть тип данных с максимальным диапазоном, то не следует его целую часть преобразовывать к типу с меньшей разрядностью. Дробная часть у меня в алгоритме изначально правильно выводилась, так что не нужно приделывать пару дополнительных колёс к коду - эту запись
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
03.08.2011, 11:23 | 57 | |||||
Да пожалуйста. Первая строчка вывода твоя, вторая моя.
30000 RU 11 KOP 30000 RU 12 KOP Вот уж сюрприз сюрпризов, ага. Так почему 10^-12 или 10^-5 или сколько надо-то? Обидно, я столько написал, а оказывается впустую. Ладно хоть не на бумаге. Возможно для тебя и это будет сюрпризом, но double не способен сохранить точно такое целое число. То есть здесь ошибка будет уже не копейками исчисляться, а сотнями рублей. Ежели очень хочется, то можно длинное целое из MPL взять. Только смысла нет. Здесь ошибка будет такая, сколько денег на земле никогда не было и не будет И здесь беда, так как для точного представления целых чисел int64_t является более вместительным, чем double.
1
|
paladin
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
|
|
03.08.2011, 12:43 | 58 |
Мда... тяжёлый тут случай. Лучше займитесь чем-нибудь более полезным (например, класс напишите для хранения сколь угодно большого целого числа, влезающего в оперативку, затем на его основе класс рациональных чисел можно забабахать).
Если по теме, то погрешность у целых чисел наподобие int абсолютная (+/-0,5), а у вещественных (флоуты, даблы там всякие) - относительная (какие-то части процента). Это на предмете Архитектура ЭВМ должны вдалбливать, но многие интересующиеся/способные узнают эту инфу много раньше.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
03.08.2011, 12:51 | 59 |
Ну до фанатизма-то доходить не нужно. Ещё раз повторяю - цель была представить целыми числами целую и дробную части, а не просто вывести на экран, при чём с сомнительной точностью. Если речь о таких больших числах - длинная арифметика в помощь. Но только здесь явно другое было нужно.
0
|
Заблокирован
|
||||||
03.08.2011, 13:14 | 60 | |||||
Вбей вот так и давай забудем эту тему
0
|
03.08.2011, 13:14 | |
03.08.2011, 13:14 | |
Помогаю со студенческими работами здесь
60
Непонятки со списком Непонятки с выводом Непонятки с сортировкой Непонятки со scanf Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |