-
什么是 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 南 无穷大 - 无穷大 南 ±无穷大 ÷ ±无穷大 南 ±无穷大×0 南 -
Как проверить, что в результате вычисления получилась бесконечность?
Есть ответ на 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