К Джон Неперу в гости приехал Генри Бриггс и сказал: "Теперь, когда вы опубликовали книгу про логарифмы, они кажутся настолько простыми и очевидными, что удивительно, как мы не додумались до этого раньше".
Нашёл эту книгу - "Занимательная алгебра" Я.И.Перельман, 1967 год. Глава "Седьмое математическое действие".
Действительно хорошо написано, и этот исторический анекдот про и "Странно, что никто не придумал это раньше" – хотел его тоже в статью добавить, но забыл )
В свою защиту скажу, что в описанном мною методе вообще не нужно запоминать никаких чисел.
Не работает для чисел длиннее 113 террабайт, но если вам реально нужно работать с такими числами, стоит установить полноценный Python или дописать в формулу ещё несколько нулей.
Понятное дело, нужно вычесть одно число из другого и проверить знак. Затем вместо if можно использовать линейную комбинацию:
где , если больше, , если больше.
Казалось бы, остаётся просто проверить знаковый бит, но это Python, детка. Здесь встроенная длинная арифметика, поэтому до знакового бита не так просто добраться.
Можно было бы использовать метод bit_length()например так:
def is_negative(x):
return -(x >> x.bit_length())
Но вряд ли bit_length() можно отнести к битовым операциям, да и присутствует он только у целых чисел, а в задаче не уточняется тип.
Пойдём другим путём.
Если посчитать модуль, то положительные числа (и ноль) не изменятся, а отрицательные поменяют знак. Проблема в том, что операция abs() тоже отсутствует в списке разрешённых. Значит, нужно возводить в квадрат.
Было б здорово, если бы была доступна операция возведения в степень. Тогда можно было найти знак так:
def get_sign(x):
return x/((x**2)**.5)
Однако, во-первых, операции ** нет в списке разрешённых, во-вторых, не работает для нуля, а у нас даже нет рта, чтобы закричать условий, чтобы проверить граничные случаи.
Ничего не получается, пойдём другим путём.
Вместо вычитания разделим . Само собой, может вызвать деление на ноль, но пока игнорируем. Если результат >1.0, значит больше, если <1.0, значит больше, если ==1.0, значит равны.
Если сконвертировать в int, то значения <1.0 превратятся в ноль. Нам бы здесь сишный !!, чтобы превратить любое ненулевое значение в единицу, но такого под рукой нет. not not - не битовая операция.
К Джон Неперу в гости приехал Генри Бриггс и сказал: "Теперь, когда вы опубликовали книгу про логарифмы, они кажутся настолько простыми и очевидными, что удивительно, как мы не додумались до этого раньше".
Мы нашли кандидата лучше.
Как понять, что комментарий написан нейронкой?
Если он начинается с «Вы правы…» — это нейронка, живой человек так никогда не скажет.
Как беспалевно проходить собеседования
Там ещё константу желательно вычесть, насколько я помню, но вообще да, хороший способ.
Потом битовыми сдвигами корни/степени считать.
Спасибо!
Нашёл эту книгу - "Занимательная алгебра" Я.И.Перельман, 1967 год. Глава "Седьмое математическое действие".
Действительно хорошо написано, и этот исторический анекдот про и "Странно, что никто не придумал это раньше" – хотел его тоже в статью добавить, но забыл )
В свою защиту скажу, что в описанном мною методе вообще не нужно запоминать никаких чисел.
Спасибо за наблюдение, поправил!
А кто-то возьмёт человека с такой строчкой в резюме?
В Таиланде свои сложности. Они не такие очевидные, как у нас, но риски всё равно присутствуют.
Неизвестные отцы
Malbolge
Rust
Javascript
Запретить блоки { ... } без управляющей конструкции перед ними.
Пардон, писал сонным, опять перепутал Befunge и Malbolge.
Который показывает, что как минимум 14 648 раз разработчики писали
вместо
Ахахаха.
Если ранжировать языки по уровню страданий для разработчика, то Rust будет где-то между JavaScript и Befunge.
Начну с простого примера в духе этой статьи: https://crates.io/crates/help
14 648 скачиваний.
Мы в студенчестве запускали Doom2 на i386 c 4Мб. Занимал 900Кб, влезал на дискетку.
Вариант только для целых чисел:
Не работает для чисел длиннее 113 террабайт, но если вам реально нужно работать с такими числами, стоит установить полноценный Python или дописать в формулу ещё несколько нулей.
Понятное дело, нужно вычесть одно число из другого и проверить знак.
Затем вместо
ifможно использовать линейную комбинацию:где
, если
больше,
, если
больше.
Казалось бы, остаётся просто проверить знаковый бит, но это Python, детка. Здесь встроенная длинная арифметика, поэтому до знакового бита не так просто добраться.
Можно было бы использовать метод
bit_length()например так:Но вряд ли
bit_length()можно отнести к битовым операциям, да и присутствует он только у целых чисел, а в задаче не уточняется тип.Пойдём другим путём.
Если посчитать модуль, то положительные числа (и ноль) не изменятся, а отрицательные поменяют знак. Проблема в том, что операция
abs()тоже отсутствует в списке разрешённых. Значит, нужно возводить в квадрат.Было б здорово, если бы была доступна операция возведения в степень. Тогда можно было найти знак так:
Однако, во-первых, операции
**нет в списке разрешённых, во-вторых, не работает для нуля, а у нас даже нетрта, чтобы закричатьусловий, чтобы проверить граничные случаи.Ничего не получается, пойдём другим путём.
Вместо вычитания разделим
. Само собой, может вызвать деление на ноль, но пока игнорируем. Если результат >1.0, значит
больше, если <1.0, значит
больше, если ==1.0, значит равны.
Если сконвертировать в
int, то значения <1.0 превратятся в ноль. Нам бы здесь сишный!!, чтобы превратить любое ненулевое значение в единицу, но такого под рукой нет.not not- не битовая операция.Решения нет, но я пока не сдаюсь ;)
.
А ризонинг как работает?