如何在Scheme中执行浮点模运算?

时间:2009-11-06 18:57:01

标签: scheme

%未定义。 modulo仅适用于整数。我想要的东西相当于Javascript的modulo / c的fmod。

6 个答案:

答案 0 :(得分:1)

我不知道计划,但在数学上你可以做类似的事情:

rem = num - trunc(num / mod) * mod;

因此对于像2.5 mod 2这样的数字你会得到:

2.5 - trunc(2.5 / 2) * 2
= 2.5 - trunc(1.25) * 2
= 2.5 - 1 * 2
= 2.5 - 2
= 0.5

答案 1 :(得分:1)

这是javascript等价物,我相信,其中n = dividend,d = divisor:

(let ((nOverD (/ n d)))
      (let ((q (if (> nOverD 0.0) (floor nOverD) (ceiling nOverD))))
        (- n (* d q))))

答案 2 :(得分:1)

flonum库定义了flmod,它可以满足您的需求。在试验计划中:

(require rnrs/arithmetic/flonums-6)
(flmod pi (sqrt 2))

答案 3 :(得分:0)

如果您的目标是将角度标准化以适合-π和π之间,那么您可以这样做:

(angle (make-polar 1 x))

否则,您可以扩展您的参数:

(define (mod* x y)
  (let* ((pi (* 4 (atan 1)))
         (c (/ y pi))
         (result (angle (make-polar 1 (/ x c)))))
    (* (+ result (if (negative? result) pi 0)) c)))

我不确定该函数应该如何处理否定参数,所以我没有考虑它们。

答案 4 :(得分:0)

mod函数似乎采用整数,有理数和浮点数(例如,在小的chez方案中):

> (mod 10 4.5)
1.0
> (mod 5.5 1.4)
1.3000000000000007
> (mod 5.5 2/3)
0.16666666666666696

如果您希望操作只采用浮点数,在方案中称为“flonum”,并且您使用的是r6rs兼容方案,则库中定义了一堆flonum操作,包括flmod ,例如:

> (flmod 5. 4.)
1.0
> (flmod 5. 4.5)
0.5
> (flmod 10. 4.5)
1.0
> (flmod 10 4.5)
Exception in flmod: 10 is not a flonum

以上是在chez计划中运行。

对于flonum操作,请参见[1]

第46页的11.3节

[1] http://www.r6rs.org/final/r6rs-lib.pdf

答案 5 :(得分:-1)

看起来余数就是你想要的词。来自here

(remainder -13 -4.0)      -1.0