|
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
|
||||||
Работа с переменными типа float и double22.06.2018, 20:04. Показов 4280. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости.
Решение:
Создан документ со следующими. . .
|
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово.
Решение:
Создан документ с единственным. . .
|
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Вычислить сумму и количество положительных элементов массива, расположенных в четных строках.
Решение:
Создан документ с. . .
|
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности.
. . .
|
|
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные.
. . .
|
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Написать программу вычисления стоимости некоторого количества (по весу) яблок.
Решение:
Создан документ, с табличной частью. . .
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|