-
什麼是 NaN?
NaN(英文Not-a-Number)是浮點數的特殊狀態之一。用於許多數學庫和數學協處理器。這種情況可能在各種情況下發生,例如,當先前的數學運算完成但結果不確定時,或者如果將不符合條件的數字輸入到儲存單元中。
根據 IEEE 754,將指數設為保留值 11...11,並將尾數設為 0 以外的任何值(機器無限大的保留值)來指定此狀態。符號和尾數可能攜帶一些附加資訊:許多庫將“負”NaN 輸出為 -NaN。
導致 NaN 作為回應的操作包括:
- 所有包含 NaN 作為運算元之一的數學運算;
- 零除以零;
- 無窮大除以無窮大;
- 零乘以無窮大;
- 無窮大與相反符號的無窮大相加;
- 計算負數的平方根[1];
- 取負數的對數。
有些程式語言有「沉默」和「訊號」NaN:第一個,當涉及任何操作時,返回NaN,第二個導致緊急情況。通常,“安靜”或“信號”由尾數的最高有效位決定。
NaN 不等於任何其他值(甚至不等於其本身[2]);因此,檢查 NaN 結果的最簡單方法是將結果值與其自身進行比較。
其他比較運算子的行為因語言而異。有些語言會產生 false[3](因此 a < b 和 b > a 對於 NaN 的行為有所不同),其他語言甚至會為「安靜」的 NaN 引發崩潰。
任何採用靜默 NaN 作為參數的重要操作都會始終傳回 NaN,無論其他參數的值為何。此規則的唯一例外是 max 和 min 函數,它們會傳回「第二個」參數的值(NaN 除外)。作為身份的簡單運算會被特別處理:例如,1NaN 等於 1。
-
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;
負無窮大 - 我們將字串轉換為數字,其中包含字母。答案是 NaN
- 無窮大減無窮大。答案是 NaN
- 還有許多其他情況,他們期望答案中包含數字,但結果未知。
任何包含 NaN 的運算都會產生 NaN。
無窮大的動作: 表達 結果 n ÷ ±無窮大 0 ±無窮大×±無窮大 ±無窮大 ±(非零)÷ ±無窮大 無窮大+無窮大 無窮 ±0 ÷ ±0 南 無窮大 - 無窮大 南 ±Infinity ÷ ±Infinity NaN ±Infinity × 0 NaN -
Как проверить, что в результате вычисления получилась бесконечность?
Есть ответ на StackOverFlow.
Все сводится к выводу
System.out.println()
-
What такое битовая маска?
Битовая маска — это когда хранится много различных логических значений (true/false) в виде одного целого числа. При этом каждому boolean-значению соответствует определенный бит.
-
Где применяют битовые маски?
В основном там, где надо компактно хранить много информации об an objectх. Когда хранишь много информации об an objectе, всегда наберется пара десятков логических переменных. Вот их всех удобно хранить в одном числе. Именно хранить. Т.к. пользоваться им в работе не так уж удобно.
-
Как установить бит в единицу в битовой маске?
Опираясь на лекции можно ответить таким 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
-
Как установить бит в ноль в битовой маске?
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.
-
Как получить 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-ой системе).
-
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 даже не очень известны. Подумайте о том, чтобы добавить их в ваш арсенал.
-
Чем отличается использование
&&
и&
для типаboolean
?&&
— это логическое «и». (В этом случае имеют место ленивые вычисления: некоторые вычисления опускаются, когда результат и так ясен)&
— это побитовое «и» (Если применить этот оператор к переменным типа Boolean, то ленивых вычислений происходить не будет)
DefNeo
等級 36
GO TO FULL VERSION