|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
||||||
Работа с переменными типа float и double22.06.2018, 20:04. Показов 4330. Ответов 39
Метки нет (Все метки)
Приветствую всех форумчан. Я тут попытался реализовать программу, которая должна считать количество чисел после запятой (например, 13.456 ввели - вывело три числа), но... что-то происходит не так. Вроде алгоритму следовал, но почему-то программа не работает.. Отрабатывает и ничего не показывает, кроме чёрного квадрата Малевича.. Может кто скажет, в чём я допустил ошибку?
0
|
||||||
| 22.06.2018, 20:04 | |
|
Ответы с готовыми решениями:
39
Работа с переменными типа float и double
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 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
|
||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 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
|
||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||||
| 25.06.2018, 14:57 | ||||
![]()
0
|
||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 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
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 25.06.2018, 15:34 | |||
|
Логично, ага! Если ты округлил до целого, то число цифр посте точки всегда равно нулю. А если до N знаков после точки, то можешь опять получить бесконечное рациональное число.----------- С другой стороны, если ввод исходных данных один хрен как текста, то зачем текст переводить в double для подсчёта ЦИФР, блин, когда их можно посчитать НЕПОСРЕДСТВЕННО в введённом тексте?!
0
|
|||
|
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
|
|
| 25.06.2018, 16:43 | |
|
Verevkin, человек хочет повеселиться с циферками. В конце концов заголовок темы "Работа с переменными типа float и double". И даже раздел "С++ для начинающих". Что мешает начинающим поэкспериментировать?
0
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 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
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 26.06.2018, 19:04 | |||
|
Да и значение далее не используется, это только вариант проверки, что строка введена правильно. Мама, роди меня обратно... З.Ы. Короче, найди статью Антона Григорьева "Неочевидные особенности вещественных чисел", и читай до полного просветления. Ссылку дать не могу. Сам найдёшь.
0
|
|||
| 26.06.2018, 19:04 | |
|
непонятка с переменными типа float Switch возможно ли работать с переменными типа float? Преобразование типа double во float
Проверка на корректность ввода типа double и float Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|