我有一个随机数生成器,它输出来自 (0, 1]
的值,但我需要将输出提供给在 0 或 1 处返回无穷大的函数。如何将生成的数字后处理为 (0, 1)
没有任何分支,因为这是为了在 GPU 上执行?
我想一种方法是添加一个微小的常数,然后取值 mod 1
.换句话说,从 (ɛ, 1 + ɛ]
生成,变成 [ɛ, 1)
.有没有更好的办法? ɛ
应该怎么办?是?
最佳答案
更新 1
在 Haskell 中,您可以找到 ɛ
通过使用 floatRange
.下面的 C++ 部分否则适用。
注:下面的答案是在 OP 表示答案应该是针对 Haskell 之前写的
您没有在问题中说明实现语言,所以我将在这里假设 C++。
看看 std::nextafter
.
这将允许您获得可以添加到上限的下一个可能值,这将导致您的代码表现得好像它是包容性的。
至于分支,你可以 重载函数以避免分支。但是,这会导致代码重复。
我建议允许分支并让编译器进行此类微优化,除非您确实需要性能并且可以提供比标准实现更专业的实现( see Pascal Cuoq's comment )。
关于haskell - 将 (0, 1] 更改为 (0, 1) 而不进行分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710816/