为什么 .NET 说次正规数永远不是 2 的幂?

Jep*_*sen 5 c# floating-point double .net-core subnormal-numbers

从 .NET 7(从 2022 年起)开始,出现了静态方法double.IsPow2

谁决定永远不应该将次正规数视为 2 的幂?例如,如果我尝试这段代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

它产生如下输出:

...
-1020 正确
-1021 正确
-1022 正确
-1023 错误
-1024 错误
-1025 错误
...

Exp2(-1024.0)因此,像(又名Pow(2.0, -1024.0)或)这样的数字5.562684646268003E-309不允许作为 2 的幂。但看起来它可能很有用;例如,十一个数字:

Exp2(-1024.0), Exp2(-1024.1), Exp2(-1024.2), Exp2(-1024.3), ...,Exp2(-1025.0)

都是不同的,但是第一个和最后一个比其他九个“更多”2的幂?

vin*_*c17 2

这是此处报告的错误并已通过此提交修复。

请注意,提交显示某些测试是错误的,即之前假设IsPow2不应在次正常情况下返回 true。