【问题标题】:How to check if a double can fit into a float without conversion to infinity如何检查双精度是否可以放入浮点数而不转换为无穷大
【发布时间】:2013-05-31 12:44:47
【问题描述】:

是否有一种标准方法可以检查 64 位浮点数是否可以在不转换为 +/- Infinity 的情况下转换为 32 位?

我知道之后可以检查它的 +/- Inf。

Convert.ToSingle() 不会这样做。

【问题讨论】:

标签: c# casting floating-point


【解决方案1】:

为了测试doubled是否会转换为float而不产生无穷大,可以测试d的绝对值是否严格低于double写成3.4028235677973366e+38(即十六进制的0x1.ffffffp+127)。这个数字是可以转换为浮点数和不能转换为浮点数之间的确切限制。

稍微扩展一下,最后的有限浮点数是:

0x1.fffffep+127   (3.4028234663852886e+38 in decimal)

如果类型 float 有更多的指数位,那么下一个 float 数字是:

0x2.000000p+127   (3.4028236692093846e+38 in decimal)

与前者相比更接近于后者的数字将向下舍入到前者。极限是两个数字的中点:

0x1.ffffffp+127   (3.4028235677973366e+38 in decimal)

【讨论】:

  • 该数字类似于 single.MinValue (如@Knagis 所建议),但不相等。我不明白为什么。
  • @IanC 你是对的,我的价值略高于。 Single.MaxValue 是最后一个有限浮点单精度数,但在“四舍五入”模式下,由于它是“最近的”,因此认为高于此数字的一些值会向下舍入。确切的限制在 Single.MaxValue 和下一个 float 值之间,如果有更多的指数位。
  • 哇,有趣。所以以下应该起作用: if (Math.Abs​​(value)
  • @IanC 是的,应该。请注意,我在没有写过一行 C# 的情况下回答了这个问题,因此如果您对其进行测试并报告,我将不胜感激 :) 如果 C# 接受十六进制浮点数,请使用符号 0x1.ffffffp+127,它会使意图更加清晰。
  • 我的答案是精确测试(float)test == +inf,根据浮点标准中精确定义的舍入规则。与Single.MaxValue 相比是安全的,因为它永远不会对会产生无穷大的数字回答“真”,但它拒绝根据规则将转换为有限浮点数的一些值。这是一个非常小的差异,您不必担心,我只是坚持,因为我不希望您留下浮点数在某种程度上不可靠的印象。
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 2013-04-19
  • 2021-05-08
  • 1970-01-01
  • 2017-11-06
  • 2015-06-12
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多