JavaRush /Blog Java /Random-PL /Poziom 30. Odpowiedzi na pytania podczas rozmowy kwalifik...
DefNeo
Poziom 36

Poziom 30. Odpowiedzi na pytania podczas rozmowy kwalifikacyjnej na temat poziomu

Opublikowano w grupie Random-PL
Poziom 30. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1
  1. Co to jest NaN?

    NaN (angielski Not-a-Number) to jeden ze specjalnych stanów liczby zmiennoprzecinkowej. Używany w wielu bibliotekach matematycznych i koprocesorach matematycznych. Warunek ten może wystąpić w różnych przypadkach, np. gdy poprzednia operacja matematyczna zakończyła się niepewnym wynikiem lub gdy do komórki pamięci została wpisana liczba niespełniająca warunków.

    Zgodnie z IEEE 754 stan ten jest określany poprzez ustawienie wykładnika na zarezerwowaną wartość 11...11, a mantysy na dowolną wartość inną niż 0 (wartość zarezerwowana dla nieskończoności maszyny). Znak i mantysa mogą zawierać dodatkowe informacje: wiele bibliotek wyświetla „ujemne” NaN jako -NaN.

    Operacje, których wynikiem jest NaN w odpowiedzi, obejmują:

    • wszystkie operacje matematyczne zawierające NaN jako jeden z operandów;
    • dzielenie zera przez zero;
    • dzielenie nieskończoności przez nieskończoność;
    • mnożenie zera przez nieskończoność;
    • dodanie nieskończoności z nieskończonością przeciwnego znaku;
    • obliczanie pierwiastka kwadratowego z liczby ujemnej[1];
    • biorąc logarytm liczby ujemnej.

    Niektóre języki programowania mają „cichą” i „sygnałową” NaN: pierwsza, gdy jest zaangażowana w jakąkolwiek operację, zwraca NaN, druga powoduje awarię. Zazwyczaj „cichy” lub „sygnał” jest określany przez najbardziej znaczący fragment mantysy.

    NaN nie jest równe żadnej innej wartości (nawet sobie [2]); W związku z tym najprostszą metodą sprawdzenia wyniku dla NaN jest porównanie otrzymanej wartości ze sobą.

    Zachowanie innych operatorów porównania różni się w zależności od języka. Niektóre języki generują false[3] (tak, że a < b i b > a zachowują się inaczej z NaN), inne powodują awarię nawet w przypadku „cichego” NaN.

    Każda nietrywialna operacja, która przyjmuje cichą NaN jako argument, zawsze zwróci NaN, niezależnie od wartości pozostałych argumentów. Jedynymi wyjątkami od tej reguły są funkcje max i min, które zwracają wartość „drugiego” argumentu (innego niż NaN). Trywialne operacje będące tożsamościami są traktowane specjalnie: na przykład 1NaN równa się 1.

  2. Jak uzyskać nieskończoność w Javie?

    W Javie typ doublema specjalne znaczenie dla plus nieskończoności i minus nieskończoności. Liczba dodatnia podzielona przez 0,0 daje „plus nieskończoność”, a liczba ujemna – „minus nieskończoność”. Pojęcia te odpowiadają specjalnym stałym typu Double:

    Kod Opis
    public static final double POSITIVE_INFINITY = 1.0 / 0.0; plus nieskończoność
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0; minus nieskończoność
    1. Konwertujemy ciąg znaków na liczbę i zawiera on litery. Odpowiedź brzmi: NaN
    2. Nieskończoność minus nieskończoność. Odpowiedź brzmi: NaN
    3. Jest wiele innych sytuacji, w których oczekują liczby w odpowiedzi, ale wynik jest nieznany.

    Każda operacja zawierająca NaN daje wynik NaN.

    Działania z nieskończonością:
    Wyrażenie Wynik
    n ÷ ± Nieskończoność 0
    ±Nieskończoność × ±Nieskończoność ± Nieskończoność
    ±(nie zero) ÷ ± Nieskończoność
    Nieskończoność + Nieskończoność Nieskończoność
    ±0 ÷ ±0 NaN
    Nieskończoność - Nieskończoność NaN
    ±Infinity ÷ ±Infinity NaN
    ±Infinity × 0 NaN
  3. Как проверить, что в результате вычисления получилась бесконечность?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Иногда, откладывая вычисления до тех пор, пока не понадобится их oznaczający, вы можете оптимизировать prędkość выполнения программы Lub реструктурировать программу в более понятную форму. Несмотря на свою ценность, методы ленивого программирования не слишком широко используются Lub даже не очень известны. Подумайте о том, чтобы добавить их в ваш арсенал.

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

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

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

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