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

发布于 2024-08-10 12:07:47 字数 91 浏览 4 评论 0原文

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

% isn't defined. modulo only works on integers. I want something equivalent to Javascript's modulo / c's fmod.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

停滞 2024-08-17 12:07:47

我不知道方案,但从数学上讲,你可以这样做:

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

I don't know scheme, but mathematically you could do something like:

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

So for a number like 2.5 mod 2 you would get:

2.5 - trunc(2.5 / 2) * 2
= 2.5 - trunc(1.25) * 2
= 2.5 - 1 * 2
= 2.5 - 2
= 0.5
紅太極 2024-08-17 12:07:47

我相信这是 javascript 的等价物,其中 n=被除数,d=除数:

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

Here is the javascript equivalent, I believe, where n=dividend, d=divisor:

(let ((nOverD (/ n d)))
      (let ((q (if (> nOverD 0.0) (floor nOverD) (ceiling nOverD))))
        (- n (* d q))))
半枫 2024-08-17 12:07:47

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

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

The flonum library defines flmod, which does what you want. In Pilot Scheme:

(require rnrs/arithmetic/flonums-6)
(flmod pi (sqrt 2))
﹉夏雨初晴づ 2024-08-17 12:07:47

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

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

我不确定该函数对于负参数应如何表现,所以我没有考虑一下他们。

If your goal is to normalize angle to fit between -π and π, then you can do it like this:

(angle (make-polar 1 x))

Otherwise, you can scale your arguments:

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

I'm not sure how the function should behave for negative arguments, so I didn't consider them.

怼怹恏 2024-08-17 12:07:47

mod 函数似乎接受整数、有理数和浮点数(例如在 petite 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" rel="nofollow noreferrer">http:// /www.r6rs.org/final/r6rs-lib.pdf

The mod function seems to take integers, rationals and floating point numbers (e.g. in petite chez scheme):

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

If you want operations that only take a floating point number, called a "flonum" in scheme and you're using a r6rs compliant scheme, there are a bunch of flonum operations defined in the library, including flmod, e.g.:

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

The above was run in chez scheme.

For flonum operations, see section 11.3 on page 46 of [1]

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

无戏配角 2024-08-17 12:07:47

看起来剩余就是你想要的词。来自此处

(remainder -13 -4.0)      -1.0

It looks like remainder is the word you want. From here:

(remainder -13 -4.0)      -1.0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文