JavaRush /Java блог /Random UA /Рівень 30. Відповіді на запитання до співбесіди на тему р...
DefNeo
36 рівень

Рівень 30. Відповіді на запитання до співбесіди на тему рівня

Стаття з групи Random UA
Рівень 30. Відповіді на запитання до співбесіди на тему рівня - 1
  1. Що таке NaN?

    NaN (англ. Not-a-Number) - один з особливих станів числа з плаваючою комою. Використовується в багатьох математичних бібліотеках та математичних співпроцесорах. Даний стан може виникнути в різних випадках, наприклад, коли попередня математична операція завершилася з невизначеним результатом, або якщо в комірку пам'яті потрапило число, що не задовольняє умовам.

    Відповідно до IEEE 754, такий стан задається через установку показника ступеня в зарезервоване значення 11 ... 11, а мантиси - будь-що, крім 0 (зарезервоване значення для машинної нескінченності). Знак і мантиса можуть нести якусь додаткову інформацію: багато бібліотек «негативний» NaN виводять як NaN.

    До операцій, що призводять до появи NaN як відповідь, відносяться:

    • всі математичні операції, що містять NaN як один з операндів;
    • розподіл нуля на нуль;
    • розподіл нескінченності на нескінченність;
    • множення нуля на нескінченність;
    • складання нескінченності з нескінченністю протилежного знака;
    • обчислення квадратного кореня негативного числа [1];
    • логарифмування від'ємного числа.

    У деяких мовах програмування є «тихий» та «сигнальний» NaN: перша, потрапивши в будь-яку операцію, повертає NaN, друга — викликає аварійну ситуацію. Зазвичай "тихий" або "сигнальний" визначається старшим бітом мантиси.

    NaN не дорівнює жодному іншому значенню (навіть самому собі [2]); відповідно, найпростіший метод перевірки результату NaN - це порівняння отриманої величини з самою собою.

    Поведінка інших операцій порівняння залежить від мови. Одні мови дають брехню [3] (так що a < b і b > a по-різному поводяться з NaN), інші викидають аварію навіть для «тихого» NaN.

    Будь-яка нетривіальна операція, яка приймає "тихий" NaN як аргумент, завжди повертає NaN незалежно від значення інших аргументів. Єдиними винятками цього правила є функції max і min, які повертають значення «другого» аргументу (відмінного від NaN). Тривіальні операції, які є тотожністю, обробляються особливо: наприклад, 1NaN дорівнює 1.

  2. Як отримати нескінченність у Java?

    У Java тип doubleмає спеціальні значення для понять «плюс нескінченність» та «мінус нескінченність». Позитивне число, розділене на 0.0, дає плюс нескінченність, а негативне - мінус нескінченність. Цим поняттям відповідають спеціальні константи типу Double:

    Код Опис
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; плюс нескінченність
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; мінус нескінченність
    1. Рядок конвертуємо до числа, а в ній є літери. Відповідь - NaN
    2. Нескінченність мінус нескінченність. Відповідь - NaN
    3. Багато інших ситуацій, де у відповіді чекають число, а виходить невідомо що.

    Будь-яка операція, де є NaN, дає у результаті NaN.

    Дії з нескінченністю:
    Вираз Результат
    n ÷ ±Infinity 0
    ±Infinity × ±Infinity ±Infinity
    ±(не нуль) ÷ ±Infinity
    Infinity + Infinity Infinity
    ±0 ÷ ±0 NaN
    Infinity - Infinity NaN
    ±Infinity ÷ ±Infinity NaN
    ±Infinity × 0 NaN
  3. Як перевірити, що в результаті обчислення вийшла нескінченність?

    Є відповідь на StackOverFlow .

    Все зводиться до висновкуSystem.out.println()

  4. Що таке бітова маска?

    Бітова маска - це коли зберігається багато різних логічних значень (true / false) як одного цілого числа. У цьому кожному boolean-значенню відповідає певний біт.

  5. Де використовують бітові маски?

    Здебільшого там, де треба компактно зберігати багато інформації про об'єкти. Коли зберігаєш багато інформації про об'єкт, завжди набереться кілька десятків логічних змінних. Ось їх усіх зручно зберігати в одному числі. Саме зберігати. Т.к. користуватися ним у роботі не так вже й зручно.

  6. Як встановити біт в одиницю у бітовій масці?

    Спираючись на лекції, можна відповісти таким кодом:

    Тут використовував метод Integer.toBinaryString(), щоб перевірити себе, а раптом)

    public class BitMask {
    
        public static void main(String[] args) {
            int a = 9;
    
           a |= (1<<2); // установить в 1 бит 2
    
    
            System.out.println(Integer.toBinaryString(a) + " "+ a);
        }
    }

    Висновок такий:

    1101 13

  7. Як встановити біт у нуль у бітовій масці?

    public class BitMask {
    
    public static void main(String[] args) {
    int a = 15;
    
    a &= ~(1<<2); // установить в 0 бит 2
    System.out.println(Integer.toBinaryString(a) + " "+ a);
    
        }
    }

    Висновок:

    1011 11

    Я взяв число 15, тому що на ньому наочно видно, куди встановлюється 0.

  8. Як одержати значення певного біта в бітовій масці?

    public class BitMask {
    
    public static void main(String[] args) {
         int a = 15;
    
         a &= ~(1<<2); // установить в 0 бит 2
    
         int c = a & (1<<2); // узнаем про 2 бит
         int d = a & (1<<3); // узнаем про 3 бит
        System.out.println(Integer.toBinaryString(a) + " "+ a + " " + c +" "+ d);
    
        }
    }

    Висновок:

    1011 11 0 8

    C 0 все відомо, на тому місці і справді 0. А змінна d повертає значення запитуваного біта (у десятій системі).

  9. Що таке ліниве обчислення виразу?

    Стаття: Ледаче програмування та ліниві обчислення

    Це ліниві обчислення (lazy evaluation). У лінивих обчисленнях жоден параметр не обчислюється, поки в ньому немає необхідності. Програми фактично починаються з кінця та працюють від кінця до початку. Програма обчислює, що має бути повернуто, і продовжує рух назад, щоб визначити, яке для цього потрібно. По суті, кожна функція викликається з promise'ами ​​для кожного параметра. Коли для обчислення необхідно значення, то виконується promise. Оскільки код виконується лише тоді, коли необхідно значення, це називається виклик за потребою (call-by-need). У традиційних мовах програмування замість promise'ів передаються значення, це називається виклик за значенням (call-by-value).

    Технологія програмування "виклик за потребою" має низку переваг. Потоки імплементуються автоматично. Непотрібні значення ніколи не обчислюються. Однак, поведінка лінивих програм часто важко передбачити. У програмах типу "виклик за значенням" порядок обчислення досить передбачуваний, тому будь-які time-або sequence-based обчислення щодо легко імплементувати. У лінивих мовах, де спеціальні конструкції, наприклад, monads, необхідні описи явно впорядкованих подій, це набагато важче. Все це також робить зв'язок з іншими мовами важчим.

    Існують мови програмування, наприклад, Haskell і Clean, які використовують ліниве програмування за умовчанням. Крім того, для деяких мов, таких як Scheme, ML та інші, існують ліниві версії.

    Іноді, відкладаючи обчислення доти, доки знадобиться їх значення, можна оптимізувати швидкість виконання програми чи реструктурувати програму на більш зрозумілу форму. Незважаючи на свою цінність, методи лінивого програмування не надто широко використовуються або навіть не дуже відомі. Подумайте про те, щоб додати їх до вашого арсеналу.

  10. Чим відрізняється використання &&і &для типу boolean?

    &&- Це логічне «і». (У цьому випадку мають місце ледачі обчислення: деякі обчислення опускаються, коли результат і так зрозумілий)

    &— це побітове «і» (Якщо застосувати цей оператор до змінних типу Boolean, то лінивих обчислень не відбуватиметься)

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ