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

时间:2014-12-30 18:44:12

标签: haskell random floating-point

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

我想一种方法是添加一个小常量,然后取值(0, 1)。换句话说,从mod 1生成,转换为(ɛ, 1 + ɛ]。有没有更好的办法? [ɛ, 1)应该是什么?

1 个答案:

答案 0 :(得分:2)

更新1

在Haskell中,您可以使用floatRange找到ɛ。下面的C ++部分也适用。


注意:以下答案是在OP之前写的,表示答案应该是Haskell

你没有在问题中陈述实现语言,所以我将在这里假设C ++。

看看std::nextafter

这将允许您获取下一个可以添加到上限的可能值,这将导致您的代码就像包含它一样。

对于分支,可以重载函数以避免分支。但是,这会导致代码重复。

我建议允许分支并让编译器进行这样的微优化,除非你真的需要性能并且可以提供比标准实现(see Pascal Cuoq's comment)更专业的实现。