Как получить-0 результатов в вычислениях с плавающей точкой и отличить его от +0 в C#?

До самых последних лет PHP определял свой AST, а интерпретатор PHP изолировал синтаксический анализатор от части оценки. В то время, когда вводится замыкание, синтаксический анализатор PHP тесно связан с оценкой.

Поэтому, когда замыкание было впервые введено в PHP, у интерпретатора нет способа узнать, какие переменные будут использоваться в замыкании, потому что оно еще не проанализировано. Таким образом, пользователь должен порадовать движок Zend явным импортом, выполняя домашнюю работу, которую должен сделать Zend.

Это так называемый простой способ в PHP.

6
задан Alexey Romanov 25 June 2009 в 13:10
поделиться

5 ответов

Вот практический пример различения между ними без проверки битов. Ссылки MSDN здесь и здесь помогли мне построить этот пример.

static void Main(string[] args)
{
    float a = 5 / float.NegativeInfinity;
    float b = 5 / float.PositiveInfinity;
    float c = 1 / a;
    float d = 1 / b;
    Console.WriteLine(a);
    Console.WriteLine(b);
    Console.WriteLine(c);
    Console.WriteLine(d);
}

Вывод:

0
0
-Infinity
Infinity

Обратите внимание, что -0 и 0 выглядят одинаково для сравнений, вывода и т. Д. Но если разделить на них 1,

16
ответ дан 8 December 2019 в 05:23
поделиться

Один из способов - использовать BitConverter.GetBytes. Если вы проверите байты, вы увидите, что знаковый бит для значения фактически установлен, что указывает на его отрицательное значение.

byte[] zeroBytes = BitConverter.GetBytes(zero);
byte[] negZeroBytes = BitConverter.GetBytes(negZero);

bool sameBytes = zeroBytes[7] == negZeroBytes[7];
2
ответ дан 8 December 2019 в 05:23
поделиться

Попробуй. Если pz - положительный ноль, а nz - отрицательный ноль:

Double.PositiveInfinity/pz => Double.PositiveInfinity
Double.PositiveInfinity/nz => Double.NegativeInfinity

Я получил это из спецификации ECMA C # .

Вы можете получить отрицательный ноль, разделив любое положительное число на отрицательную бесконечность:

10.0/Double.NegativeInfinity
2
ответ дан 8 December 2019 в 05:23
поделиться

Отрицательный ноль связан с тем, как хранится число в двоичном формате - это не какой-либо реально достижимый результат математического вычисления.

В памяти с плавающей запятой самый верхний бит часто используется для обозначения знака. Это оставляет 31 бит для данных (в 32-битном значении с плавающей запятой), так что фактически есть два представления для нуля.

00000000 00000000 00000000 00000000
Или
00000000 00000000 00000000 00000001

Оба представляют ноль, но единицу с отрицательным битом знака.

Естественно, это обычно происходит, когда вы увеличиваете максимально возможное положительное число, оно переполняется обратно до отрицательного нуля.

В .net, однако, я думаю, что по умолчанию тип проверяет переполнение и генерирует исключение, а не позволяет вам переполняться, поэтому единственный способ действительно заархивировать это значение - установить его напрямую. Кроме того, -0 всегда должно сравниваться с +0.

Подробнее об этом можно узнать на Wikipeida

3
ответ дан 8 December 2019 в 05:23
поделиться

После проверки я вижу, что -1.0 / double.PositiveInfinity возвращает -0. Действительно, 1.0 / (-1.0 / double.PositiveInfinity) возвращает -infinity .

0
ответ дан 8 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: