计算8位二进制数的平方根


14

我一直在寻找一种仅使用数字组合或顺序逻辑来计算给定8位数字的平方根的方法。那可能吗?

一种方法可能是仅使用查找表,因为我根本不考虑小数部分(因此),但必须有比这更好的方式。有人可以指出我的意思吗?103


4
我将使用带有范围的简单查找表。每个输出的最小数量和最大数量,您只需检查一下即可。
Kortuk

6
查找似乎很简单。毕竟,对于8位数字的平方根,只有16种可能的答案。
Olin Lathrop'4

3
嗯..唯一的答案是0000至1111; 只有输入64或更高的输入将在答案中设置最高位,因此这只是输入的高两位的或。现在您只有8位的三个功能可以减少..
JustJeff 2012年

Answers:


9

查找表已在注释中提及。有两种方法。

快速
创建一个256字节长的表,每个下一个值是相应索引的平方根。这是快速的,因为您使用参数作为索引来直接访问正确的值。缺点是它需要一个长表,并且有很多重复的值。

紧凑
如前所述,一个8位整数只能具有0到255的值,并且相应的平方根是0到16(四舍五入)。构造一个第16个条目表(从零开始),第n个条目的平方根为n的参数的最大值。表将如下所示:

 0  
 2  
 6  
12  
20
etc.

您遍历表格并在遇到大于或等于自变量的值时停止。示例:18的平方根

set index to 0
value[0] = 0, is less than 18, go to the next entry  
value[1] = 2, is less than 18, go to the next entry  
value[2] = 6, is less than 18, go to the next entry  
value[3] = 12, is less than 18, go to the next entry
value[4] = 20, is greater than or equal to 18, so sqrt(18) = 4

快速查找表具有固定的执行时间(仅一次查找),但是对于较高值的参数,执行时间更长。

对于这两种方法,都可以通过为表选择不同的值来选择平方根的舍入值或截断值。


2
如果您将该表倒置,则平均而言,您需要进行的迭代次数会更少
Federico Russo

在较短的表格上进行二进制搜索可以平均提高算法的速度。您从查找表的中间开始(位置8),然后决定所找到的值是太高还是太低,然后向上或向下移动4位。重复直到完成。
jippie

7

以8位工作,您基本上只能使用整数解决方案。如果需要X的平方根,则可以得到的最接近的是平方小于或等于X的最大整数。例如,对于sqrt(50),您将得到7,因为8 * 8将大于50

因此,这样做有一个窍门:计算从1开始的奇数个数,可以从X减去。您可以使用如下逻辑进行操作:一个8位寄存器R1保存工作值,一个7位计数器R2保留(大部分)奇数,并且一个4位计数器R3保留结果。复位时,R1加载X值,R2清除为零,R3清除为零。一个8位减法器电路向R1馈送给'A'输入,R2的值与一个固定为'1'的LSB(通过上拉)相结合给'B'输入。减法器输出8位差AB和借位。在每个时钟,如果借位清零,则R1装入减法器输出,R2递增,R3递增。如果设置了借位,则R1不会加载,R2,R3不会递增,b / c结果现在已经在R3中准备好了。

交替地

只有16个可能的输出值,因此答案是4位数字。本质上,您具有8个输入位中的四个单位功能。现在,我无法绘制8维卡诺图,但原则上,您只需为答案的每一点提出一个组合电路。将这四个组合电路的输出放在一起,并将其解释为四位答案。瞧 没有时钟,没有寄存器,只需一堆NAND和NOR就足够了。


我整晚都在琢磨。输出中的8位显然是两个最高有效输入位的函数。同样,我认为输出中的4位可能只是前4个输入位的函数:00x1、001x,1xx1和11x1似乎对其进行了设置。稍后将对此进行验证。
JustJeff 2012年

1
如果要在FPGA中执行此操作,则可以将其放入一个大case语句中,然后由综合工具完成所有工作。一方面,这有点像在分布式RAM(用作ROM)中做一个大的查询表。另一方面,该工具应该找到您在评论中提到的优化。
Photon

5

我不知道这是否有帮助,但是有一种巧妙的简单方法可以计算平方根:

unsigned char sqrt(unsigned char num)
{
    unsigned char op  = num;
    unsigned char res = 0;
    unsigned char one = 0x40;

    while (one > op)
        one >>= 2;

    while (one != 0)
    {
        if (op >= res + one)
        {
            op -= res + one;
            res = (res >> 1) + one;
        }
        else
        {
            res >>= 1;
        }

        one >>= 2;
    }
    return res;
}

我对顺序逻辑中可以做什么和不可以做什么不了解,但是由于该算法仅在4个循环中完成,因此您可以在4个阶段中实现它。


4

28

    A =     a
     or     b;

    B =     a and     b
     or not b and     c
     or not b and     d;

    C =     a and     b and     c
     or     a and     b and     d
     or     a and not b and not c and not d
     or     a and not c and not d and     e
     or     a and not c and not d and     f
     or not a and     c and     d
     or not a and     c and     e
     or not a and     c and     f
     or not a and not b and not d and     e
     or not a and not b and not d and     f;

     D =     a and     b and     c and     e
     or     a and     b and     c and     f
     or     a and     c and     d
     or     a and not b and not c and not d
     or     a and not b and not d and     e and     f
     or     a and not b and not d and     e and     g
     or     a and not b and not d and     e and     h
     or     a and not c and not d and not e and not f
     or     b and     c and not d and not e and not f and     g
     or     b and     c and not d and not e and not f and     h
     or not a and     b and not c and     d and     e
     or not a and     b and not c and     d and     f
     or not a and     b and not c and     d and     g
     or not a and     b and not c and     d and     h
     or not a and     c and not d and not e and not f
     or not a and     d and     e and     f
     or not a and     d and     e and     g
     or not a and     d and     e and     h
     or not a and not b and     c and not e and not f and     g
     or not a and not b and     c and not e and not f and     h
     or not a and not b and not c and     e and     f
     or not b and     c and     d and     e
     or not b and     c and     d and     f
     or not b and not c and not d and not f and     g
     or not b and not c and not d and not f and     h;

1
哇,那是什么软件?它适用于任意大尺寸吗?您如何从这些SOP表格中得出实际构建门的最小数量?在这一点上,看起来cpld或更高版本肯定是构建它的最实用方法。
captncraig 2012年

@CMP很抱歉延迟回复。我使用了这里提供的程序:home.roadrunner.com/~ssolver ,它可以接受真值表-我使用了一个简单的Python脚本为每个整数平方根数字生成真值表。上面的那些SOP实际上最小形式的,在程序用来最小化它们的算法的能力范围内。
Bitrex

1
@CMP正如您所说,以这种方式实现整数平方根会很疯狂,因为可以使用查找表,或者为整数平方根编写一种算法,然后让您选择的HDL语言对其进行合成。
Bitrex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.