【已解决,可删帖】求助:怎么用lisp写数学上的mod求余函数?
本帖最后由 cchessbd 于 2022-11-8 08:12 编辑(rem (- 100 150) 200) 返回的是-50,这与mod函数返回结果 150不一样,请问怎么用lisp写数学上的求余函数?
(rem 200 (- 100 150))??? 自贡黄明儒 发表于 2022-11-7 14:07
(rem 200 (- 100 150))???
不对。返回值为0。 本帖最后由 菜卷鱼 于 2022-11-7 15:27 编辑
(rem 200(-150 100))
??
cchessbd 发表于 2022-11-7 14:37
不对。返回值为0。
mod函数是一个求余函数,其格式为: mod(nExp1,nExp2),即是两个数值表达式作除法运算后的余数。特别注意:在EXCEL中,MOD函数是用于返回两数相除的余数,返回结果的符号与除数(divisor)的符号相同。
你希望结果是多少呀? 学习学习{:1_1:} 本帖最后由 guosheyang 于 2022-11-7 15:51 编辑
不能整除且同号时取被除数本身 异号不能整除时 取二者之和 好像是这样 Excel的算法和CAD的有点区别 本帖最后由 guosheyang 于 2022-11-7 18:04 编辑
(defun mod(n1 n2)
(if(<(abs n1)(abs n2))
(if(/= n1 0)
(if(>(* n1 n2)0)
n1
(+ n1 n2)
)
0
)
( if(>(* n1 n2)0)
(rem n1 n2)
(*(if(minusp n2)-1 1)(-(abs n2)(rem(abs n1)(abs n2))))
)
)
) 有点繁琐哪位帮忙优化下
本帖最后由 ytianxia 于 2022-11-7 17:49 编辑
我理解这应该就是 lisp和excel 对异号求余的理解不一致造成的吧,我试了下,excel 应该是以被除数的符号为准,而 CAD以除数符号为准。
(defun mod (n1 n2)
(setq m (rem n1 n2))
(if (< (* n1 n2) 0)
(+ m n2)
m
)
)
8楼写的代码好像不太对,n1>n2 就不讨论了吗?
简单一些,正常求余,如果异号,那余数加上被除数就可以了。 ytianxia 发表于 2022-11-7 17:47
我理解这应该就是 lisp和excel 对异号求余的理解不一致造成的吧,我试了下,excel 应该是以被除数的符号为 ...
n1>n2也考虑 只是搞复杂了 你这个简单明了
页:
[1]
2