明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1112|回复: 11

[提问] 【已解决,可删帖】求助:怎么用lisp写数学上的mod求余函数?

[复制链接]
发表于 2022-11-7 14:02:40 | 显示全部楼层 |阅读模式
本帖最后由 cchessbd 于 2022-11-8 08:12 编辑

(rem (- 100 150) 200) 返回的是-50,这与mod函数返回结果 150不一样,请问怎么用lisp写数学上的求余函数?


点评

论坛的好处就是知识积累,问题解决了,就留着给后来人参考,而不需要删帖。  发表于 2022-11-8 09:09
发表于 2022-11-7 14:07:03 | 显示全部楼层
(rem 200 (- 100 150))???
 楼主| 发表于 2022-11-7 14:37:40 | 显示全部楼层

不对。返回值为0。
发表于 2022-11-7 15:23:31 | 显示全部楼层
本帖最后由 菜卷鱼 于 2022-11-7 15:27 编辑

(rem 200(-  150 100))

??
发表于 2022-11-7 15:30:42 | 显示全部楼层
cchessbd 发表于 2022-11-7 14:37
不对。返回值为0。

mod函数是一个求余函数,其格式为: mod(nExp1,nExp2),即是两个数值表达式作除法运算后的余数。特别注意:在EXCEL中,MOD函数是用于返回两数相除的余数,返回结果的符号与除数(divisor)的符号相同。
你希望结果是多少呀?
发表于 2022-11-7 15:49:14 | 显示全部楼层
本帖最后由 guosheyang 于 2022-11-7 15:51 编辑

不能整除且同号时  取被除数本身   异号不能整除时   取二者之和    好像是这样   Excel的算法和CAD的有点区别
发表于 2022-11-7 16:00:00 | 显示全部楼层
本帖最后由 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))))
  )  
)
)  
有点繁琐  哪位帮忙优化下
发表于 2022-11-7 17:47:21 | 显示全部楼层
本帖最后由 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 就不讨论了吗?
简单一些,正常求余,如果异号,那余数加上被除数就可以了。
发表于 2022-11-7 18:25:29 | 显示全部楼层
ytianxia 发表于 2022-11-7 17:47
我理解这应该就是 lisp和excel 对异号求余的理解不一致造成的吧,我试了下,excel 应该是以被除数的符号为 ...

n1>n2也考虑   只是搞复杂了   你这个简单明了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 00:20 , Processed in 0.187871 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表