无聊的题目:如何用matlab语言编出除法运算
大家都知道MCU计算除法是有代价的,就是计算时间相对于乘法比较“久”,也就是除法是费劲儿的。因为无聊,所以就给大家出这个题目了,很馊却又很有趣的题目。我之前是没有接触过相关教程的,聪明的你,能否仅用“加法,减法,乘法,比大小(大于等于小于),逻辑运算,二进制运算”几个基本运算,实现除法运算。记得用matlab语言实现,并且亲自测试 收敛性 和 matlab运算除法的时间,对比大小。
静候 惊艳的答案
DeepSeek给出的代码{:3_49:}
function quotient = my_div(dividend, divisor)
% 自定义除法,仅使用加法、减法、乘法、比较、逻辑运算和二进制运算
% 处理除数为0的情况
if divisor == 0
error('除数不能为零');
end
% 确定商的符号
sign_factor = 1;
if (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)
sign_factor = -1;
end
% 转换为绝对值计算
dividend_abs = abs(dividend);
divisor_abs = abs(divisor);
quotient = 0;
remainder = dividend_abs;
while remainder >= divisor_abs
temp = divisor_abs;
k = 0;
% 找到最大的k使得 divisor_abs * 2^(k+1) <= remainder
while temp * 2 <= remainder
temp = temp * 2;
k = k + 1;
end
% 累加2^k到商,使用位移操作(二进制运算)
quotient = quotient + bitshift(1, k);
% 更新余数
remainder = remainder - temp;
end
% 应用符号
quotient = quotient * sign_factor;
end
代码解释
符号处理:通过判断被除数和除数的符号是否相同来确定商的符号。
逐次逼近:
在每次循环中,找到最大的指数k,使得除数×2^k不超过当前余数。
使用二进制位移操作(bitshift)快速计算2^k,避免直接使用幂运算。
余数更新:从当前余数中减去除数×2^k,并累加对应的商值。
循环终止:当余数小于除数时,终止循环并返回结果。
此方法通过二进制位移和乘法高效逼近商值,确保仅使用允许的基本运算,适用于整数除法运算。
页:
[1]