Почему .NET говорит, что субнормальные числа никогда не являются степенями 2?
Начиная с .NET 7 (с 2022 года) существует статический метод
.double.IsPow2
.
Кто решил, что никогда не следует рассматривать сверхнормальные числа как степени двойки? Например, если я попробую этот код:
double exp = -1000.0;
while (true)
{
double pow2 = double.Exp2(exp);
if (pow2 == 0.0)
{
break;
}
bool isOk = double.IsPow2(pow2);
Console.WriteLine($"{exp} {isOk}");
--exp;
}
он производит вывод типа:
... -1020 Правда -1021 Правда -1022 Правда -1023 Ложь -1024 Ложь -1025 Ложь ...
Итак, число типа (он жеPow(2.0, -1024.0)
или5.562684646268003E-309
) не допускается как степень двойки. Но, похоже, это может быть полезно; например, одиннадцать чисел:
Exp2(-1024.0)
,Exp2(-1024.1)
,Exp2(-1024.2)
,Exp2(-1024.3)
, ...,Exp2(-1025.0)
все разные, но первая и последняя имеют «больше» степеней 2, чем остальные девять?