将(0,1)更改为(0,1)而不进行分支

yon*_*ong 5 random floating-point haskell

我有一个输出值的随机数生成器(0, 1],但是我需要将输出提供给一个在0或1处返回无穷大的函数.如何在(0, 1)没有任何分支的情况下对生成的数字进行后处理,因为这是为了在GPU上执行?

我想一种方法是添加一个小常数然后取值mod 1.换句话说,生成from (?, 1 + ?],变成了[?, 1).有没有更好的办法?应该?是什么?

OMG*_*chy 2

更新1

\n\n

在 Haskell 中,您可以\xc9\x9b通过使用找到floatRange查找。下面的 C++ 部分否则适用。

\n\n
\n\n

笔记:下面的答案是在OP表示答案应该针对Haskell之前写的

\n\n

您没有在问题中说明实现语言,因此我将在这里假设 C++。

\n\n

看一眼 std::nextafter

\n\n

这将允许您获得下一个可能的值,您可以将其添加到上限,这将导致您的代码表现得好像它是包容性的。

\n\n

至于分支,你可以重载该函数以避免分支。然而,这会导致代码重复。

\n\n

我建议允许分支并让编译器进行此类微优化,除非您确实需要性能并且可以提供比标准实现更专业的实现(请参阅 Pascal Cuoq 的评论)。

\n

  • 我所指的实现:https://github.com/aosm/Libm/blob/master/Source/Intel/nextafter.s 该版本是开源的,但最新版本不是。无论如何,对于“nextafter”和许多浮点函数来说,有巨大的改进,这些改进只能在上下文中实现(这里:参数在 0 和 1 之间),并且不适用于必须在所有情况下工作的库函数。案例。此外,最先进的编译器完全无法推断意图并为您专门化标准函数。 (2认同)