2009-11-06 32 views
1

%未定义。 modulo只适用于整数。我想要一些相当于Javascript的模/ c的fmod。如何在Scheme中执行浮点模运算?

+2

你问的具体方案,问题在这里;请尽量不要使用浮点参数作为第一个参数 – 2009-11-06 23:20:07

回答

1

这里是JavaScript等价的,我相信,其中n =红利,d =除数:

(let ((nOverD (/ n d))) 
     (let ((q (if (> nOverD 0.0) (floor nOverD) (ceiling nOverD)))) 
     (- n (* d q)))) 
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

它看起来像其余的是你想要的字。从here

(remainder -13 -4.0)  -1.0 
+0

尽管如此 – Claudiu 2009-11-06 19:18:13

1

flonum库定义flmod,这你想要做什么。在试验计划:

(require rnrs/arithmetic/flonums-6) 
(flmod pi (sqrt 2)) 
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))) 

我不知道函数应该如何处理负面的论点,所以我没有考虑它们。

0

mod功能似乎取整数,有理数和浮点数(以娇小桑切斯方案如):

> (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 

以上在桑切斯方案运行。

对于flonum操作,见11.3节第46页上的[1]

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