Блог пользователя -dp-

Автор -dp-, 14 лет назад, По-русски

"Константин Прайссер (Konstantin Preisser) недавно обнаружил нечто весьма любопытное: Java — и рантайм и компилятор — входит в бесконечный цикл при конвертации десятичного 2.2250738585072012e-308 в double."

http://habrahabr.ru/blogs/java/112948/

Теоретически, при удачном сложении звезд, так можно кого-нибудь и зачелленджить... Так что товарищи javaписатели имейте ввиду.

  • Проголосовать: нравится
  • +10
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
java под ударом. Наверное стоит запретить этот тест для челенжа взлома.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится

    На топкодере челенж не получится, потому что убьется и авторское решение тоже :о

    • 14 лет назад, # ^ |
        Проголосовать: нравится +14 Проголосовать: не нравится
      А на топкодере авторские решения на java? Тогда я уже прям представляю что-то типа: "Your challenge was unsuccessful. The program got TL as expected."
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
О да, мне непременно понадобится именно это число :D

Гораздо веселее то, что Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE
Правда, не исключено, что в других языках тоже так, я не проверял.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Так это вполне обосновано: Math.abs(Integer.MIN_VALUE=-2^31)=2^31=(2^31-1)+1. Т. к. максимальное значение int равно 2^31-1, то +1 ведёт к переполнению и указывает как раз на число -2^31. 
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      нет, (2^31-1) + 1 ведёт к переполнению, и указыввает на число 0

      2^31 - 1 = 1111111111111111111...(32 единицы)

      .....11111+1 = ....000000000000

      а 2^31 = 1000000000000000000(31 нолик)

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это как? 31-я степень содержит 31 нулей, а после вычитания превращается в 32 единицы?)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Ни в коем случае не оскорбляю вас, но не понимаю, как вы можете быть жёлтым, если не знаете таких основ...

        (2^31-1) + 1 будет указывать на (-2^31).

        ибо:

        2^31 - 1 = 1000...(31 ноль)...0000 - 1 = 01111...(31 единица)...11111

        01111...(31 единица)...11111 + 1 = 1000...(31 ноль)...0000 = -2^31 - это отрицательное число. Все отрицательные числа начинаются с 1 в битовой записи, причём самое маленькое, это число у которого старший бит равен 1, остальные 0.

        По этой логике, самое большое отрицательное число (-1), это которое имеет все 1 в битовой записи, так оно и есть: если прибавить к нему 1, то получим 0.

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Уверен, что на проекте найдется немало серых и зеленых, которые это знают и немало желтых и, возможно, несколько красных, которые этого не знают. Лично я не припомню олимпиадных задач, в которых это знание критично.

          Я все-таки думаю, что основы информатики и умение решать олимпиадные задачи - разные вещи.
          • 14 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится
            А еще многие математики способны безошибочно брать нехилые интегралы, но зато легко багают в арифметике ))))
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
            Боюсь, что сейчас знание основ информатики стало необязательным даже для тех, у кого программирование - профессия.
            К большому сожалению, по-моему.
        • 14 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится

          Ой, че то я попутал

          2^31 - 1 = 1111111111111111111...(32 единицы)

          вот эта моя строчка гон, 2^32 - 1 = 111111...(32 еденицы) или -1

          я просто немного попутал в цифрах, а так конечно в битах и "теории цифр" немного понимаю. я даже длинку всегда пишу в дополнительном коде (при любом основании СС), чтобы с отрицательными числами не заморачиваться :)

14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Да я знаю, что это обоснованно.
Скорее всего, и в других языках то же самое.

Блин, снова коммент не туда написал.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я вот думаю, а как это обнаружено? Код компилятора закрыт, как мне кажется. Если он наткнулся на него случайно, то, вероятно, есть и другие такие числа. Или это какое-то особое число?
14 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится
Особое. Обрати внимание, число заканчивается на 2012. Мне кажется разработчики java решили пошутить и специально это сделали.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Или специально не учли
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Обычно в задачах с вещественным вводом есть ограничение на максимальную точность вводимых чисел (обычно от 2х до 6ти знаков). Так что такой взлом скорее всего не получится сделать.