【问题标题】:Generate next largest or smallest representable floating point number without bit twiddling生成下一个最大或最小的可表示浮点数,无需位旋转
【发布时间】:2011-09-15 01:53:06
【问题描述】:

给定一个任意的有限浮点数,有没有办法确定下一个可表示的浮点数是什么?例如,给定 1.0f,根据定义,下一个最大的可表示数是 1.0f + std::numeric_limits::epsilon()。有没有一种方法可以为任何值合成一个 epsilon - 而不仅仅是 1.0f - 而无需求助于位旋转和/或机器如何表示浮点值的明确知识?

【问题讨论】:

  • 我不认为没有机器表示的一些小技巧和明确的知识就可以完成,但我对 std::numeric_limits 的东西不是很熟悉

标签: c++ floating-point


【解决方案1】:

在 C++11 中,您使用 std::nextafter()。缺少这一点,在 C99 系统上,您可以使用 C 数学库中的 nextafterfnextafternextafterl(分别用于类型 floatdoublelong double)。

【讨论】:

  • <tgmath.h> 中还有 nextafter() 类型泛型宏(C99 中的;我不知道 C++ 是否有)。
  • 哈!我不知道这存在。
  • 在 Visual C++ 2010 中,它似乎是 _nextafter
【解决方案2】:
int exponent;
significand= frexp(number, &exponent);
significand+= epsilon;
next= ldexp(significand, exponent);

它的作用是提取尾数,将其增加浮点 epsilon,然后重建浮点数。这应该是您通过摆弄尾数位(以及尾数溢出的指数)获得的下一个可表示数字。

【讨论】:

  • 我赞成,因为它对我有用,但我不认为这对整个范围都有效。在测试我的实现时,我尝试从零开始,然后又回到零,但我无法达到零。
  • 我不相信这会正确处理非规范化的值,或者如果有效数字溢出,在这种情况下需要增加指数。
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2023-03-19
  • 2022-07-21
  • 1970-01-01
相关资源
最近更新 更多