在我机器上小数和整数运算相差 200倍我想知道 Sqr(X)函数如何用整数方式表达..

解决方案 »

  1.   

    sql(30)=5.47722557505166
    ??????不懂你的意思
      

  2.   

    浮点速度太慢了,不好意思我好象还没用过好点的机器 p233X=Sqr(1+Y*Y)Y已知,想不用Sqr 得到 X 怎么求? 只使用加减乘除整数运算?
      

  3.   

    谢谢 但看不懂 能否给出 VB 的写法 感谢!/****************************************/ 
    /*Function: 开根号处理                  */ 
    /*入口参数:被开方数,长整型            */ 
    /*出口参数:开方结果,整型              */ 
    /****************************************/ 
    unsigned int sqrt_16(unsigned long M) 

        unsigned int N, i; 
        unsigned long tmp, ttp;   // 结果、循环计数 
        if (M == 0)               // 被开方数,开方结果也为0 
            return 0;     N = 0;     tmp = (M >> 30);          // 获取最高位:B[m-1] 
        M <<= 2; 
        if (tmp > 1)              // 最高位为1 
        { 
            N ++;                 // 结果当前位为1,否则为默认的0 
            tmp -= N; 
        }     for (i=15; i>0; i--)      // 求剩余的15位 
        { 
            N <<= 1;              // 左移一位         tmp <<= 2; 
            tmp += (M >> 30);     // 假设         ttp = N; 
            ttp = (ttp<<1)+1;         M <<= 2; 
            if (tmp >= ttp)       // 假设成立 
            { 
                tmp -= ttp; 
                N ++; 
            }     }     return N; 
    }
      

  4.   

    'unsigned int sqrt_16(unsigned Long M)
    Public Function sqrt_16(ByVal M As Long) As Long
        Call Init
    '{
    '    unsigned int N, i;
        Dim N As Long, I As Long
    '    unsigned Long tmp, ttp;   // 结果、循环计数
        Dim tmp As Long, ttp As Long
    '    if (M == 0)               // 被开方数,开方结果也为0
        If M = 0 Then
            sqrt_16 = 0
            Exit Function
    '        return 0;
        End If
    '
    '    N = 0;
        N = 0
    '
    '    tmp = (M >> 30);          // 获取最高位:B[m-1]
        tmp = RShift(M, 30)
    '    M <<= 2;
        M = LShift(M, 2)
    '    if (tmp > 1)              // 最高位为1
        If tmp > 1 Then
    '    {
    '        N ++;                 // 结果当前位为1,否则为默认的0
            N = N + 1
    '        tmp -= N;
            tmp = tmp - N
    '    }
        End If
    '
    '    for (i=15; i>0; i--)      // 求剩余的15位
        For I = 15 To 1 Step -1
    '    {
    '        N <<= 1;              // 左移一位
            N = LShift(N, 1)
    '
    '        tmp <<= 2;
            tmp = LShift(tmp, 2)
    '        tmp += (M >> 30);     // 假设
            tmp = tmp + RShift(M, 30)
    '
    '        ttp = N;
            ttp = N
    '        ttp = (ttp<<1)+1;
            ttp = LShift(ttp, 1) + 1
    '
    '        M <<= 2;
            M = LShift(M, 2)
    '        if (tmp >= ttp)       // 假设成立
            If tmp > ttp Then
    '        {
    '            tmp -= ttp;
                tmp = tmp - ttp
    '            N ++;
                N = N + 1
    '        }
            End If
    '
    '    }
        Next
    '
    '    return N;
        sqrt_16 = N + 1
    '}
    End Function其中的左移位LShift和右移位函数可以去网上搜索一下MD5,记得MD5算法里也有移位操作的
      

  5.   

    因为VB中只有Byte类型是无符号的,所以上面这段C程序翻译过来后可能会有点不妥
    记得当年中学老师曾经教过笔算开平方方法,或者你可以试一下^_^
      

  6.   

    笔算开平方方法:
    http://member.21maths.com/zxkt/chu2/2/1.1-3.asp