非整数的模运算/余数函数

29

rem的作用是:

Prelude> rem 9 8
1

我想要像这样的东西:

Prelude> nonIntRem 9.1 8
1.0999999999999996

我是这样实现的:

nonIntRem x y = x - (y * (fromIntegral $ truncate (x/y)))

我的问题是:

  1. 类似这样的功能在标准的Haskell库中是否已经存在?我更喜欢使用标准函数,可能我已经错过了它。
  2. 如果没有,在其他语言中,是否有更标准的名称用于此函数?也许是fmod,但在这种情况下,负数的行为不像mod,而像rem。如果没有标准名称,您能否为此函数想到更好的名称?
  3. 它似乎正常工作,但如果您注意到此函数存在问题,我想知道。

1
是的,fmod 是 C 语言中的名称,所以 frem 看起来像是一个合理的扩展。 - luqui
此外,toInteger 是唯一防止浮点类型成为 Integral 实例的东西... 如果你可以接受这个漏洞,也许只需实例化它,然后你就可以称之为 rem(实现 quotRem,你就可以得到所有浮点数的 div/mods)。 - luqui
1个回答

22
你需要的函数是来自于 Data.Fixed 模块中的 mod'

10
是的,这很接近。但是,这个代码中的mod操作对负数的处理方式与我的函数不同,我的函数使用rem操作对负数进行处理。 例子: Prelude Data.Fixed> mod' 9.1 (-8) 结果为:-6.9 Prelude Data.Fixed> nonIntRem 9.1 (-8) 结果为:1.0999999999999996 - renick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接