mxlzhenzhu 发表于 2024-10-21 23:30

无聊的题目:如何用matlab语言编出除法运算

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


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

静候 惊艳的答案

Frank 发表于 2025-3-4 13:21

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]
查看完整版本: 无聊的题目:如何用matlab语言编出除法运算