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

标签 haskell random floating-point

我有一个随机数生成器,它输出来自 (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/

相关文章:

iphone - 比较 Objective-C 中的 float 和 double 数据类型

haskell - GHC 7.7 中引入的自由覆盖条件破坏了 GHC 7.6 中有效的代码

scala - Scala 和 Haskell 中的阶乘

c# - 生成随机唯一代码

C++ 将 float 转换为字符串

c++ - 对于非常接近于零的值,双重计算运行得更慢

haskell - haskell 中的顶级可变变量

function - 两个相似的函数如何在 Haskell 中具有不同的多态类型?

haskell - Haskell 数据类型的非均匀分布

javascript - 来自数组的随机 javascript HEX 颜色