|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
||||||
Работа с переменными типа float и double22.06.2018, 20:04. Показов 4440. Ответов 39
Метки нет (Все метки)
Приветствую всех форумчан. Я тут попытался реализовать программу, которая должна считать количество чисел после запятой (например, 13.456 ввели - вывело три числа), но... что-то происходит не так. Вроде алгоритму следовал, но почему-то программа не работает.. Отрабатывает и ничего не показывает, кроме чёрного квадрата Малевича.. Может кто скажет, в чём я допустил ошибку?
0
|
||||||
| 22.06.2018, 20:04 | |
|
Ответы с готовыми решениями:
39
Работа с переменными типа float и double
|
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
|
| 25.06.2018, 09:58 | |
|
0
|
|
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
||||||||||||||||
| 25.06.2018, 14:20 | ||||||||||||||||
|
N0VY, смотря про какой вариант вы говорите.
1. double: вообще здесь разные варианты. Можете создать строку и в неё записывать все цифры, какие находите, можете записывать их в long long, просто умножая на 10 и прибавляя единицу. Я предлагаю такой, если уж с double играть:
0
|
||||||||||||||||
|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
||||||
| 25.06.2018, 14:30 [ТС] | ||||||
|
Лично я написал примерный синтаксис, только он выводит как-то всё неправильно. (ноут: сиауты в цикле для того, что-бы понимать, что происходит с числом в цикле) Зачем использовать копию в вашем первом примере, если можно использовать само число?
Добавлено через 666666 минут)
0
|
||||||
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
|
| 25.06.2018, 14:46 | |
|
0
|
|
|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
||||||
| 25.06.2018, 14:55 [ТС] | ||||||
|
Такое дело: для меня она слишком сложна в плане понимания. Я говорил уже, что таких вещей, как sscanf, strchr не знаю. С языка С не знаю, как пользоваться scanf'ом. Без обид
![]() Добавлено через 666 минут ![]() ![]() ![]() В общем, теперь такое дело: почему у меня эта программа не работает? Вроде-бы сделал то, что нужно, следовал сначала формуле для отделения целой части числа от самого числа, умножал полученное число на 10 до тех пор, пока nmb - (int)nmb не станет равным нулю.... Либо я использовал формулу не в том месте, либо мне нужно было её дополнить. Но как, если, например, нельзя делить числа с типом double или находить их %? Иногда я сам дивлюсь логике... которой нету. ![]()
0
|
||||||
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
||||
| 25.06.2018, 14:57 | ||||
![]()
0
|
||||
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
|
| 25.06.2018, 15:03 | |
|
Считать цифры после точки в значении с плавающей точкой (!!!) - это дурь, потому что ты вводишь десятичное число как строку, а оно преобразовывается в двоичный double (знак + мантисса + экспонента) с погрешностью! Введёшь 0.7, а выведешь 0.69999999999999999999999999234745637646 5.
0
|
|
|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
|
| 25.06.2018, 15:19 [ТС] | |
|
Я это понимаю, но один товарищ (Bleach) сделал так, что-бы лишние числа не выводились и елести не было.
Добавлено через 1 минуту Лично мои рассуждения таковы: нужно округлить полученное число, что-бы не было лишних цифр. Добавлено через 2 минуты Виноват, каюсь... Кстати, а как програмируем тогда без компа: с телефона чтоль?
0
|
|
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
|||
| 25.06.2018, 15:34 | |||
|
Логично, ага! Если ты округлил до целого, то число цифр посте точки всегда равно нулю. А если до N знаков после точки, то можешь опять получить бесконечное рациональное число.----------- С другой стороны, если ввод исходных данных один хрен как текста, то зачем текст переводить в double для подсчёта ЦИФР, блин, когда их можно посчитать НЕПОСРЕДСТВЕННО в введённом тексте?!
0
|
|||
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
|
| 25.06.2018, 16:43 | |
|
Verevkin, человек хочет повеселиться с циферками. В конце концов заголовок темы "Работа с переменными типа float и double". И даже раздел "С++ для начинающих". Что мешает начинающим поэкспериментировать?
0
|
|
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
||
| 25.06.2018, 16:55 | ||
|
------------- Я вижу, что пациент явно не шарит, и пытаюсь помочь именно сэкономить время на решение задачи, предложив более резонный и менее затратный метод. Но пациент активно сопротивляется и оправдывается своим невежеством, доказывая, что ему, как раз, надо именно "шашечки, а не ехать".
0
|
||
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
|||
| 25.06.2018, 17:26 | |||
|
Максимальное значение int = 2^31 - 1, дальше начинается переполнение. То есть после того, как ваше число перевалит за 2.147.483.647, выражение nmb - (int)nmb практически никогда не будет равным нулю. Если хотите оставить программу такой же - приводите к long long. Его максимум составляет чуть больше 9 * 10^19 Добавлено через 14 минут Ошибся слегка, 17 знаков => от 10^16 max(long long) = 9 * 10^18
0
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 25.06.2018, 23:09 | |
|
N0VY просто не может понять, что число с double хранится в виде
a*2^N где a - мантисса, N - показатель степени.В обычной же жизни мы имеем дело с числами вида a*10^N. Например 12.345 это 12345*10^(-3). А комп (по крайней мере большинство из современных) считают в бинарном виде, поэтому умножать им проще на степень 2ки. Поэтому для компа характерны числа наподобие 0b100101*0b10^0b11001 . Если перевести из бинарного формата чисел в десятичные, то это то же самое что 37*2^25 . Но умножение на 2 нельзя превратить в умножение на 10 (по крайней мере пока умножаем на целое число 2ек). Ну примерно так же как 1024 байта в килобайте нельзя превратить в 1000 - остаток из 24 останется и будет портить точность. Именно поэтому у вас ничего и не работает.Поэтому вас два пути - 1) использовать строку а не число. Комп без вашей помощи ничего посчитать с этой строкой не сможет, но вот изучить её цифры (символы) сможет вполне (типа "две цифры после запятой, и там ещё прибавок с 10 в степени") 2) использовать double в том виде, в котором она на самом деле. Т.е. что например используется число 5434*2^-10 (или 5434/1024)
0
|
|
|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
|
| 26.06.2018, 11:47 [ТС] | |
|
(Обращение к Верёвкину) Невежество?
Верёвкин, если я не знаю вещей, которые вы наверняка знаете (в случае языка С) это значит, что я невежественен и я сопротивляюсь? Я просто не понимаю вашей проги.. И у меня "молоко на губах не обсохло". Дело всё в практике, которую мои учителя по программирования, выскажусь мягко, "в сторонку посылали" : используют метод "делай, как хочешь, главное - сделай (даже списывать разрешают, но я не люблю этим пользоваться)". А это единственное место, где я могу учиться програмированию. Ну и этот форум - единственное, что меня спасает во время обучения. Спасибо большое этому форуму за то, что он есть, кстати говоря! Думать я умею, но слишком сложно, и всё из-за того, что у меня нет практики. Поэтому я прошу помощи у тех, кто знает лучше, может высказать свою мысль о том, как делать ту или иную вещь. Самому всё выискивать? Если бы всё было так легко... со временем. которое я трачу на делание д/з.(Ближе к делу): алгоритм, который я хочу реализовать (но реализовал неудачно) проще, чем "дважды два", это я сам чёрт подери понимаю, но НЕТ: он не работает, хотя должен, просто обязан, я понимаю, что он должен работать так!! Кстати: поэксперементировать хотел я, действительно, но я хочу использовать данную программу для реализации программы сокращения числа... Наверняка пустяки для таких профессионалов, как вы, но хардово для такого новичка, как я. Если бы меня понимали... ![]() Добавлено через 3 минуты Кстати, что такое мантисса?
0
|
|
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
| 26.06.2018, 12:34 | |
|
Алгоритм, конечно, придумать можно, но
Если надо анализировать количество чисел после запятой, стоит анализировать символьные данные, а не double представление.
0
|
|
|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
|
| 26.06.2018, 12:35 [ТС] | |
|
Почему символьные?
0
|
|
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
||
| 26.06.2018, 13:17 | ||
|
потому-что double не даёт точного представления десятичных дробных. Теряется информация о количестве знаков.
Добавлено через 3 минуты О чем, собственно, говорит камрад Verevkin.
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 26.06.2018, 17:18 | ||
|
P.S. https://ru.wikipedia.org/wiki/... й_точности
0
|
||
|
Злостный нарушитель
10921 / 5849 / 1289
Регистрация: 12.03.2015
Сообщений: 26,957
|
|||
| 26.06.2018, 19:04 | |||
|
Да и значение далее не используется, это только вариант проверки, что строка введена правильно. Мама, роди меня обратно... З.Ы. Короче, найди статью Антона Григорьева "Неочевидные особенности вещественных чисел", и читай до полного просветления. Ссылку дать не могу. Сам найдёшь.
0
|
|||
| 26.06.2018, 19:04 | |
|
непонятка с переменными типа float Switch возможно ли работать с переменными типа float? Преобразование типа double во float
Проверка на корректность ввода типа double и float Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|