![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Есть! Только я не понимаю, как умножая на 10 Вы собираетесь свести ldval к нулю:
По идее, с нулём нужно сравнивать дробную часть ldval:
На выходе получается что-то вроде
Ну, благодаря тому, что в числе 10 есть множитель двойка (а про двоичное машинное представление я уже говорил), предел, конечно, наступит. Каждое очередное умножение на двойку обнуляет очередной бит в хвосте мантиссы. Поскольку таких битов 63, то получаем максимальную итерацию - 63. Но если бы Вы захотели распечатать число, скажем, в 5-ричном виде, то конца бы не дождались))) На 10 происходит неявное деление, как только Вы пишите:
И вот тут машинное двоичное 0.456 не совпадает с нашим десятиричным 0.456 - чуть чуть, но отличается. PS Сравнение чисел с плавающей точкой с нулём, вообще говоря, не корректно. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
akizelokro |
|
||||||||||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
комментарии пишутся для того, чтобы их читали
и почти это как раз вы сделали. (почему вы это сделали "почти", обяснение чуть ниже. не надо было изначально умножать в цикле на 10 до упора, не обнуляя целую часть, и всё это пытаться поместить в int'овскую переменную. и, кстати, из приведенного кода неочевидно, что
из-за куска в коде
здесь опять же идёт интересный момент double -= (double)(int)double поставьте число на вывод сразу после определения
конечно бы не дождался. такого варианта задачи я себе даже не ставил. точный же метод решения задачи был мной сразу приведён. сразу "хавать" введённое число с клавиатуры в string и парсить его. Добавлено @ 07:23 в принципе, можно при реализации алгоритм и подправить, учесть знак, умножить на "-1" например, если вообще интересует тогда уж строгое соответствие делает не сравнение, что не равно 0, а сравнение больше-равно нулю, отнимать не (int)х, а double-единицу в цикле пока число не станет меньше 1, чтобы не путаться лишний раз с приведением double к int и обратно. Мораль сего спича такова, вообщем. Если есть задача вывести целую или вещественную часть double-числа в строковый вид, то не надо налегать на int'ы. Это уже лишняя сущность и использовать её нужно желательно по минимуму, потому что в логике задачи не требуется. Это сообщение отредактировал(а) akizelokro - 21.8.2013, 07:26 -------------------- a = a + b; b = a - b; a = a - b; |
||||||||||||
|
|||||||||||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Моё (сугубо индивидуалистическое) видение решения задачи выглядит так:
Результаты получаются такого рода:
Что не хорошо (помимо артефактов деления на 10).
Что-то мне подсказывает, что >> не умеет читать long double, а только double... Да и вообще, long double лишь синоним double (это у Microsoft). -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Прошу прощения, пропустил, увлёкся кодом))) Остальное ничего не понял((( Если не нравится (double)(int)double (чем именно?) пользуйтесь modf. Что плохого в (double)(int)double? Ну и что, что лишнее приведение, главное, в точности потерь нет. Какие тонкости нужно выдерживать? Как именно их выдерживать - вычитать по 1.0??? И что это даст? Вы в курсе, что при этом будет задействован алгоритм, описанный ещё у Кнута, по "сглаживанию" вывода. То есть вывод != машинному представлению числа. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Я просто не уверен, что в случае (double)(int)3.123 получится именно 3.0, а не опять очередная потеря точности Поэтому и не хочу применять преобразования double к int и обратно. Это к утверждению, почему возможно, что не аргумент в данном случае. Да ничего там не будет такого. А будет там просто считывание ввода сразу в строку - tcin >> <строка>. Предположу, что как раз это и нужно автору темы (раз тема для новичков), а не подробные уже дебри. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Может, я чего не понимаю, но невидно никаких подводных камней по этому поводу. Число x - хорошее, не inf, не nan, < 10 и >= 1, откуда потеря точности? ![]() ![]()
Это сообщение отредактировал(а) feodorv - 21.8.2013, 11:08 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Давай говорить просто, про проверку изначальну. что число long double не NAN или не infifnity, вспомнил только я.
про то, что не надо скопом всё сразу на червонец умножать, пока число не приведёт к переполнению, а отхватывать после каждого умножения на 10, опять же вспомнил только я. (я в своём алгоритме даже не рассматриваю пределы максимальных значений int). кроме простого вывода в строку (опят же написал я), есть ещё и варианты printf свыводом не на устройство вывода, а опять же в строку. Если Кнут сделал алгоритм, то зашибись ( хотя какие мне дела до Кнута, я алгоритмист не хуже) -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |