JavaRush /Java Blog /Random-IT /Livello 30. Risposte alle domande dell'intervista sull'ar...
DefNeo
Livello 36

Livello 30. Risposte alle domande dell'intervista sull'argomento del livello

Pubblicato nel gruppo Random-IT
Livello 30. Risposte alle domande dell'intervista sull'argomento del livello - 1
  1. Cos'è NaN?

    NaN (inglese Not-a-Number) è uno degli stati speciali di un numero in virgola mobile. Utilizzato in molte librerie matematiche e coprocessori matematici. Questa condizione può verificarsi in diversi casi, ad esempio quando una precedente operazione matematica si è conclusa con un risultato incerto, oppure se in una cella di memoria è stato inserito un numero che non soddisfa le condizioni.

    Secondo IEEE 754 questo stato viene specificato impostando l'esponente sul valore riservato 11...11 e la mantissa su un valore diverso da 0 (il valore riservato per l'infinito della macchina). Il segno e la mantissa possono contenere alcune informazioni aggiuntive: molte librerie emettono NaN “negativo” come -NaN.

    Le operazioni che restituiscono NaN come risposta includono:

    • tutte le operazioni matematiche contenenti NaN come uno degli operandi;
    • dividere zero per zero;
    • dividere l'infinito per infinito;
    • moltiplicare zero per infinito;
    • somma dell'infinito con l'infinito del segno opposto;
    • calcolare la radice quadrata di un numero negativo[1];
    • prendendo il logaritmo di un numero negativo.

    Alcuni linguaggi di programmazione hanno NaN “silenzioso” e “segnale”: il primo, quando coinvolto in una qualsiasi operazione, restituisce NaN, il secondo provoca un'emergenza. Tipicamente, "silenzioso" o "segnale" è determinato dal bit più significativo della mantissa.

    NaN non è uguale a nessun altro valore (nemmeno a se stesso[2]); Di conseguenza, il metodo più semplice per verificare un risultato per NaN è confrontare il valore risultante con se stesso.

    Il comportamento di altri operatori di confronto varia in base alla lingua. Alcuni linguaggi producono false[3] (così che a < b e b > a si comportano diversamente con NaN), altri generano un crash anche per NaN “tranquillo”.

    Qualsiasi operazione non banale che accetta un NaN silenzioso come argomento restituirà sempre NaN, indipendentemente dal valore degli altri argomenti. Le uniche eccezioni a questa regola sono le funzioni max e min, che restituiscono il valore dell'argomento "secondo" (diverso da NaN). Le operazioni banali che sono identità vengono trattate in modo speciale: ad esempio, 1NaN è uguale a 1.

  2. Come ottenere l'infinito in Java?

    In Java, il tipo doubleha significati speciali per più infinito e meno infinito. Un numero positivo diviso per 0,0 dà "più infinito" e un numero negativo - "meno infinito". Questi concetti corrispondono a costanti speciali di tipo Double:

    Codice Descrizione
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; più infinito
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; meno infinito
    1. Convertiamo la stringa in un numero e contiene lettere. La risposta è NaN
    2. Infinito meno infinito. La risposta è NaN
    3. Ci sono molte altre situazioni in cui ci si aspetta un numero nella risposta, ma il risultato è sconosciuto.

    Qualsiasi operazione che contiene NaN restituisce NaN.

    Azioni con infinito:
    Espressione Risultato
    n ÷ ±Infinito 0
    ±Infinito × ±Infinito ±Infinito
    ±(diverso da zero) ÷ ±Infinito
    Infinito + Infinito Infinito
    ±0 ÷ ±0 NaN
    Infinito - Infinito NaN
    ±Infinito ÷ ±Infinito NaN
    ±Infinito × 0 NaN
  3. Как проверить, что в результате вычисления получилась бесконечность?

    Есть ответ на StackOverFlow.

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

  4. What такое битовая маска?

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

  5. Где применяют битовые маски?

    В основном там, где надо компактно хранить много информации об an objectх. Когда хранишь много информации об an objectе, всегда наберется пара десятков логических переменных. Вот их всех удобно хранить в одном числе. Именно хранить. Т.к. пользоваться им в работе не так уж удобно.

  6. Как установить бит в единицу в битовой маске?

    Опираясь на лекции можно ответить таким codeом:

    Здесь использовал метод 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, так How на нем более наглядно видно, куда устанавливается 0.

  8. Как получить meaning определенного бита в битовой маске?

    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 возвращает meaning запрашиваемого бита (в 10-ой системе).

  9. What такое ленивое вычисление выражения?

    Статья: Ленивое программирование и ленивые вычисления

    Это ленивые вычисления (lazy evaluation). В ленивых вычислениях ни один параметр не вычисляется, пока в нем нет необходимости. Программы фактически начинаются с конца и работают от конца к началу. Программа вычисляет, что должно быть возвращено, и продолжает движение назад, чтобы определить, Howое meaning для этого требуется. В сущности каждая функция вызывается с promise'ами для каждого параметра. Когда для вычисления необходимо meaning, тогда выполняется promise. Поскольку code выполняется только тогда, когда необходимо meaning, это называется вызов по необходимости (call-by-need). В традиционных языках программирования instead of promise'ов передаются значения, это называется вызов по значению(call-by-value).

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

    Существуют языки программирования, например, Haskell и Clean, использующие ленивое программирование по умолчанию. Кроме того, для некоторых языков, таких How Scheme, ML и другие, существуют ленивые версии.

    Иногда, откладывая вычисления до тех пор, пока не понадобится их meaning, вы можете оптимизировать speed выполнения программы or реструктурировать программу в более понятную форму. Несмотря на свою ценность, методы ленивого программирования не слишком широко используются or даже не очень известны. Подумайте о том, чтобы добавить их в ваш арсенал.

  10. Чем отличается использование && и & для типа boolean?

    && — это логическое «и». (В этом случае имеют место ленивые вычисления: некоторые вычисления опускаются, когда результат и так ясен)

    & — это побитовое «и» (Если применить этот оператор к переменным типа Boolean, то ленивых вычислений происходить не будет)

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION