Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 将(0,1)更改为(0,1)而不进行分支_Haskell_Random_Floating Point - Fatal编程技术网

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

Haskell 将(0,1)更改为(0,1)而不进行分支,haskell,random,floating-point,Haskell,Random,Floating Point,我有一个从(0,1]输出值的随机数生成器,但我需要将输出提供给一个在0或1处返回无穷大的函数。我如何在没有任何分支的情况下对生成的数字进行后处理,因为这是在GPU上执行的 我想一种方法是添加一个很小的常数,然后取值mod 1。换句话说,从(ɛ,1+ɛ)生成,它被转换成[ɛ,1)。有更好的方法吗?更新1 在Haskell中,您可以通过使用找到 。下面的C++部分应用。 注意:下面的答案是在OP表示答案应该是针对Haskell之前写的 你不在问题中陈述实现语言,所以我将在这里假定C++。< /P>

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


我想一种方法是添加一个很小的常数,然后取值
mod 1
。换句话说,从
(ɛ,1+ɛ)
生成,它被转换成
[ɛ,1)
。有更好的方法吗?

更新1

在Haskell中,您可以通过使用找到<代码> <代码>。下面的C++部分应用。


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

你不在问题中陈述实现语言,所以我将在这里假定C++。< /P> 看一看

这将允许您获得下一个可能的值,您可以将其添加到上限,这将导致您的代码表现为包含

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


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

这是用什么语言实现的?您使用什么语言?复制和修改(或至少阅读和理解)您当前的伪随机数生成器可能是您最好的方法。对于我的特殊用途,我感兴趣的是可以与Haskell中的Accelerate一起使用的东西。随机数生成器来自Curand。乘以(1-ɛ)。这很好,但您确定它不会导致最小值变为0吗?上次我查看x86-64上的
nextafter
的实现时,它有3个链式条件分支(可能是为了确保各种IEEE 754标志接收到正确的值),因此任何使用
nextafter
的解决方案都肯定不是“无分支”,虽然可以制作自己的无分支受限版本。@PascalCuoq虽然情况可能是这样,但通过使用标准库函数,您可以获得库实现人员能够提供的最佳功能。如果您能够提供更好的,并且库是开源的,我建议您提出一个包含改进的请求。实现正如所指:该版本是开源的,但最新版本不是。无论如何,对于
nextafter
和许多浮点函数,有一些只有在上下文中才能实现的巨大改进(这里:参数介于0和1之间),这并不适用于必须在所有情况下都能工作的库函数。而且,最先进的编译器完全无法为您推断出标准函数的意图并专门化它。@PascalCuoq Fair comment。尽管这一点现在似乎已不存在,因为OP现在已将Haskell声明为目标语言。