Задачи на преобразование целых типов
Комментарии (341)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
BuyankinM Software Developer
12 мая 2023, 19:41
Приведение бесконечности к long красиво выглядит )
(long) (1234.0 / 0)
После работы с другими языками ждал ошибку.
+1
Maxim Belich Работает в BelEnergo
5 марта 2023, 10:36
Оставлю для будущих поколений..
Поделюсь своими наблюдениями на тему 2 задачи под названием "Приблизительное значение".
Для начала советую не спеша изучить процесс перевода десятичного числа в двоичную систему счисления числа с плавающей точкой. После изучения этой темы вам будет известно как число с плавающей точкой хранится в памяти: 1 бит хранит знак, 8 битов хранят экспоненту, оставшиеся 23 бита хранят мантиссу. После ручного перевода числа с плавающей точкой в двоичную систему счисления вам будет известно почему числа на выходе так странно округляются (23 бита мантиссы недостаточно, чтобы хранить всё число). Я задал вопрос на StackOverflow про такое округление. Вот что мне ответили:
Эти преобразования используют round-to-nearest mode, т.е. выбирается ближайшее число, которое представимо в нужном формате. В Вашем случае один кандидат меньше исходного числа на 82, другой больше на 46. Выбирается второй, т.к. он "ближе"
Ответ всего один и то мало понятный, но после кое-каких манипуляций я стал немного больше понимать "round-to-nearest mode"
Посмотрим на такой пример:
Получается какой-то абсурд. Получается, что float b может хранить в себе число Long.MAX_VALUE без потерь, а число меньше (1234567890) не может!
Я попробовал сделать тоже самое, но с int:
+10
Maxim Belich Работает в BelEnergo
5 марта 2023, 10:36
Опять получается абсурд! Число интеджера MAX_VALUE флоат хранить может без потерь, а число меньше 1234567890 хранить не может!
И тут то закрался вопрос - почему всё прекрасно работает, когда мы даём флоату максимальные числа разных типов данных? Может он может хранить без потерь только их?
Давайте попробуем сделать по-другому, а именно отнимем единицу от Integer.MAX_VALUE:
Как мы видим, в 3 sout мы получаем число не такое, которое мы получили в 1 sout. Третье число как-то "само округлилось" в большую сторону. И я не знаю почему)
По всей видимости так и работает этот загадочный (по крайне мере пока что) round-to-nearest mode.
+8
Владислав
13 апреля 2023, 14:27
было интересно!
а еще у меня возникла другая гипотеза, пока разбирался, что вы написали. Нечетные числа - без потерь, а четные - с приближением)) Но это лишь на ваших примерах.
Потом я проверил - это не подтвердилось)
0
Timur KhasmamedovExpert
1 февраля 2023, 22:03
Кому нужно объяснение, ловите...
По третьей задаче.
почему ?
для начала. что такое scientific notanion. если сильно упрощать, это запись иначе того, что мы обычно представляем как десятичные числа, но запись хитрая.
внимание на e2d и e-3 на конце записей.
здесь это в первом случае Е2 = 10^2, а д - double precision exponent. точность, если упрощать.
двойная (дабл)
что в итоге получаем ? в первом случае: 2.50256*100=250.256, дробная часть отбрасывается, в итоге 250.
во втором: 500e-3, обратите внимание на - (или минус 3). потому что это 10^(-3) или... 1/1000, или
500*0.0001, в итоге 0.5
Также как и с шортом выше,
Теперь. 150000 / 'd' - тут от чара берется значение https://unicode-table.com/en/ интовое, а именно 100, в итоге получается 1500
По второй задаче.
float f = (byte) 128.50;
здесь будет -128.0
почему ? вначале приводим к байту, отбрасываем дробное значение. выходит 128
128 не лезет в +127 (верхняя граница байта), потому...
ну и в конце приводим обратно к флоату, добавляя дробную часть.
если не заморачиваться с вычислениями и принять как данность, будет усечение с "сюрпризом".
если интересно, можно разложить побитово и поиграться с значением, будет тот же результат, но возможно более поянтно.
+7
Lir
5 июня 2023, 20:25
спасибо за объяснение, особенно за пояснение значения переменной типа char.
0
Goodislav
13 января, 12:12
Спасибо за разъяснение. Тут обнаружил опечатку: лишний ноль в 0.001 (одна тысячная)
"потому что это 10^(-3) или... 1/1000, или
500*0.0001, в итоге 0.5"
0
sH@Rk
22 октября 2022, 20:15
Ндя, очень хотелось бы подробных разьяснений как решается последняя задача да как происходит приведение типов и их значений в этом случае. Да еще впервые вижу запись чисел через черточку
+2
Bingo Boom
2 сентября 2022, 08:51
Сделал задачи и даже как-то с лёгкостью, но сам не понял как это вышло, буду разбираться ещё в теме
0
Кристина
19 августа 2022, 14:04
используйте дебаг и пишите расчёты на бумажке, так в тыщу раз легче))))
+2
sH@Rk
22 октября 2022, 20:14
Как раз собрался искать инфо, как использовать дебаг. Есть где инфо, чтоб долго не искать? спасибо!
0
Кристина
24 октября 2022, 11:43
была лекция по этой теме где-то в начале
0
Сергей
5 июля 2022, 09:19
у меня тоже знатно подгорело.
Задачи - бред.
0
Алексей Щукин
24 апреля 2022, 08:56
Подскажите, по какой причине при преобразовании целого числа 1234567890 во float получается 1.23456794E9, а не 1.23456789E9? Ведь знаков после запятой и в первом и во втором случае одинаковое количество и вроде как нет необходимости подрезать точность.
0
Ilya Mamedov
14 апреля 2022, 01:20
Для чего делать такие задания для такой простой темы
0
Михаил
8 апреля 2022, 01:14
ох и ребусы такую простую тему так усложнить
0
Zhulien
26 апреля 2022, 20:05
все же дело в заданиях, а не вмне,да?🙃
+3
nikinou
31 августа 2022, 10:05
точно дело в них!
0