2009-11-06 2 views
1

% не определен. modulo работает только с целыми числами. Я хочу что-то, что соответствует fmod modulo/c javascript.Как выполнить операцию модуляции с плавающей запятой в Схеме?

+2

Вы задаете схему конкретных вопросов здесь; пожалуйста, держите свои теги в минимальном –

ответ

1

Вот Javascript эквивалент, я считаю, где п = дивиденд, 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 мод 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

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 функция, кажется, принимает целые, рациональные и числа с плавающей точкой (например, в миниатюрной схеме Chez):

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

Если вы хотите операции, которые только принимают число с плавающей точкой, называется «Вещественные числа» в схема и вы используете совместимые схемы r6rs, есть куча операций Вещественных чисел определенная в библиотеке, в том числе 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.

Для Вещественные числа операций, смотрите раздел 11.3 на стр 46 из [1]

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

Смежные вопросы