我知道怎么做c。 计算平方根,取平方根的模数10。 如果模数为0,那么它就是一个完美的正方形。
但是我怎么能在装配中做到这一点,因为我不能在其中做一个平方根。 有更简单的方法吗?
答案 0 :(得分:3)
你看过牛顿的方法吗?
http://en.wikipedia.org/wiki/Newton's_method
以mips为单位的浮点寄存器
http://en.wikipedia.org/wiki/MIPS_architecture#Floating_point
另一个类似的线程
Finding square root of an integer on MIPS assembly
你自己尝试过编码吗?你的装配水平是多少?
感谢。
答案 1 :(得分:0)
是的,你可以在装配中做平方根。浮点数的平方根,即。如果您的MIPS CPU支持浮点指令(这些指令大多数都是这些天),则它具有SQRT.D命令(平方根为double)。
如果您需要有关算法其余部分的帮助,请执行以下操作: G。将通用寄存器复制到浮点寄存器,将整数转换为浮点数和返回值,FP算法,请说明。
答案 2 :(得分:0)
您可以在C或C ++中实现它,然后查看反汇编。
为了有效地做到这一点,我建议使用迭代二进制搜索:
int isSquare(unsigned int num)
{
unsigned int lo = 0;
unsigned int hi = num;
do
{
unsigned int mid = (hi+lo)/2;
unsigned int square0 = mid*mid;
unsigned int square1 = (mid+1)*(mid+1);
if (num == square0 || num == square1)
return 1;
if (num < square0)
hi = mid;
else // if (num > square1)
lo = mid;
}
while (lo+1 < hi);
return 0;
}
请注意,此功能的任何输入都不能大于2^(num_of_bits_per_int/2+1)-3
。