声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 673|回复: 1

[计算数学] 无聊的题目:如何用matlab语言编出除法运算

[复制链接]
发表于 2024-10-21 23:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家都知道MCU计算除法是有代价的,就是计算时间相对于乘法比较“久”,也就是除法是费劲儿的。因为无聊,所以就给大家出这个题目了,很馊却又很有趣的题目。


我之前是没有接触过相关教程的,聪明的你,能否仅用“加法,减法,乘法,比大小(大于等于小于),逻辑运算,二进制运算”几个基本运算实现除法运算。记得用matlab语言实现,并且亲自测试 收敛性 和 matlab运算除法的时间,对比大小。

静候 惊艳的答案
回复
分享到:

使用道具 举报

发表于 2025-3-4 13:21 | 显示全部楼层
DeepSeek给出的代码

  1. function quotient = my_div(dividend, divisor)
  2. % 自定义除法,仅使用加法、减法、乘法、比较、逻辑运算和二进制运算

  3. % 处理除数为0的情况
  4. if divisor == 0
  5.     error('除数不能为零');
  6. end

  7. % 确定商的符号
  8. sign_factor = 1;
  9. if (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)
  10.     sign_factor = -1;
  11. end

  12. % 转换为绝对值计算
  13. dividend_abs = abs(dividend);
  14. divisor_abs = abs(divisor);

  15. quotient = 0;
  16. remainder = dividend_abs;

  17. while remainder >= divisor_abs
  18.     temp = divisor_abs;
  19.     k = 0;
  20.    
  21.     % 找到最大的k使得 divisor_abs * 2^(k+1) <= remainder
  22.     while temp * 2 <= remainder
  23.         temp = temp * 2;
  24.         k = k + 1;
  25.     end
  26.    
  27.     % 累加2^k到商,使用位移操作(二进制运算)
  28.     quotient = quotient + bitshift(1, k);
  29.    
  30.     % 更新余数
  31.     remainder = remainder - temp;
  32. end

  33. % 应用符号
  34. quotient = quotient * sign_factor;
  35. end
复制代码


代码解释
符号处理:通过判断被除数和除数的符号是否相同来确定商的符号。

逐次逼近:

在每次循环中,找到最大的指数k,使得除数×2^k不超过当前余数。

使用二进制位移操作(bitshift)快速计算2^k,避免直接使用幂运算。

余数更新:从当前余数中减去除数×2^k,并累加对应的商值。

循环终止:当余数小于除数时,终止循环并返回结果。

此方法通过二进制位移和乘法高效逼近商值,确保仅使用允许的基本运算,适用于整数除法运算。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2025-3-11 19:29 , Processed in 0.077520 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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