为什么 .NET 说次正态数从来都不是 2 的幂?

Why does .NET say that subnormal numbers are never powers of 2?

提问人:Jeppe Stig Nielsen 提问时间:10/3/2023 更新时间:10/3/2023 访问量:81

问:

自 .NET 7(从 2022 年开始)以来,一直存在静态方法双倍。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;
}

它产生如下输出:

...
-1020 True
-1021 True
-1022 True
-1023 False
-1024 False
-1025 False
...

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

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

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

C# .net-core 浮点双 正态数

评论

1赞 Eric Postpischil 10/3/2023
要么是错误,要么是软件在次正常结果或操作数刷新为零的模式下运行,因此只接收到零,而不是次正常值。当您直接打印结果时,它显示了什么?IsPow2IsPow2Exp2
2赞 chux - Reinstate Monica 10/3/2023
@EricPostpischil应该防止“IsPow2 仅收到零”的情况。if (pow2 == 0.0)
0赞 Eric Postpischil 10/3/2023
@chux-ReinstateMonica:是的,但这需要我阅读问题中的所有代码,这显然是一个过度的负担。无论如何,“A 和 B”和“Not B”意味着“A”,因此 中存在一个错误。IsPow2
0赞 chux - Reinstate Monica 10/3/2023
@EricPostpischil只是看起来坏了,而 MS 宁愿保持这种状态,也不愿做对IsPow2()

答:

2赞 vinc17 10/3/2023 #1

这是此处报告的错误,并由此提交修复。

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