定点数除法

        public static DFix FastDiv(DFix x, DFix y)
        {
            long xl = x.m_rawValue;
            long yl = y.m_rawValue;
            long result = 0;

            if (yl == 0)
            {
                throw new DivideByZeroException();
            }

            bool negative = ((xl >= 0) ^ (yl >= 0));        // 符号位
            ulong remainder = (ulong)(xl >= 0 ? xl : -xl);  // 余数,被除数
            ulong divider = (ulong)(yl >= 0 ? yl : -yl);    // 除数
            ulong quotient = remainder / divider;           // 商数,先求得整数部分

            remainder = remainder - quotient * divider;
            if(0 == remainder)
            {
                // 整除了,商数即结果
                result = (long)(quotient << FRACTIONAL_PLACES);
            }
            else
            {
                // 需要执行小数部分的除法
                ulong fraction = 0;     // 小数部分
                int fractionBits = 0;   // 小数点位数,初始为0
                while(0 != remainder && fractionBits < FRACTIONAL_PLACES)
                {
                    remainder <<= 1;    // 被除数右边补0
                    fractionBits++;     // 小数位数增1
                    if (remainder >= divider)
                    {
                        // 够减,小数部分左移一位并加1,且更新被除数
                        fraction = (fraction << 1) + 1;
                        remainder -= divider;
                    }
                    else
                    {
                        // 不够减,小数部分左移一位并加0
                        fraction = (fraction << 1) + 0;
                    }
                }
                result = (long)((quotient << FRACTIONAL_PLACES) + (fraction & FRACTIONAL_MASK));
            }

            // 添加符号
            result = negative ? -result : result;

            return new DFix(result);
        }

记录一下,以后补全。

时间: 2024-08-24 13:08:46

定点数除法的相关文章

【重学计算机】计组D3章:运算方法与运算器

1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法1:V = XYS + XYS(XY为两个加数的符号位,S为结果的符号位,_表示非),那么V = 1则为溢出 方法2:V = C0 ⊕ C1(C0是最高数据位产生的进位,C1是符号位产生的进位),那么V = 1则为溢出 方法3:V = Xf1 ⊕ Xf2(数据采用变型补码 Xf1Xf2 X0X1X2

定点数的定标

转自:http://blog.csdn.net/longxuekun1992/article/details/52895302 1. 选取合适的定标值(加载操作数)定标的大小,影响着整数部分和小数部分的位数,定标的过程其实是在操作数动态范围和精度之间做权衡的过程. 设一个变量可能出现的最大绝对值为|max|,n为正整数,满足2^(n-1) < |max| < 2^n,则定标Q按如下规则选取最合适: Q = 有效数据位 – n 对于32位的有符号数,数据有效位=31.如|max| = 2.75,

11、定点数和浮点数

我们平时都会用到小数,通常我们可以把小数表示成10的幂的形式,如12.21=1x101+2x100+2x10-1+1x10-2.但是有一些很难表示,如1/3. 小数用二进制表示的最简单的方法是BCD码,这在表示钱的时候特别有用. 通常把两个BCD数字存放在一个字节,这种方式成为压缩BCD.由于2的补数不和BCD数一起使用,因此压缩BCD通常需要增加1位用来标识数的正负,该位被称做符号位.用一整个字节保存某个特定的BCD数是很方便的,但要为这个短小的符号位牺牲4位或8位的存储空间. 看个例子,假设

shell中除法运算

A=`expr $num1 / $num2` 这个时候num3=0 ,是因为是因为expr不支持浮点除法 小数点标识的方法: A=`echo "scale=2; $num1/$num2" | bc` 使用bc工具,sclae控制小数点后保留几位 另一种方法 A=awk 'BEGIN{printf "%.2f\n",'$num1'/'$num2'}' 百分比表示 A=awk 'BEGIN{printf "%.2f%\n",('$num1'/'$nu

计算机中如何实现除数是2的幂次的除法【转载自CSDN】

前言: 本来是在看汇编里面的数据条件传送指令,做习题的时候看着这么一道有关于2的幂次方除法的题目.结果傻眼了,又尼玛不会了.........第二章看的时候就稀里糊涂的,看了几遍也没看太懂,这回又涉及到了 ,发现再回来看还是容易一点.所以写此博文,方便日后复习. 我今天遇到的问题如下: 问题: 除法,在我们平时的算数运算中,结果总是向0的方向舍入的,但是在计算机中,舍入的方式有所不同.在大多数的机器中,除法要比乘法还有加法这些运算都要慢很多倍,计算机中对于2的幂次这种数很是敏感,因为计算机当中用到

【练习赛2补题】poj 2325 Persistent Numbers 【高精度除法+贪心】

Description The multiplicative persistence of a number is defined by Neil Sloane (Neil J.A. Sloane in The Persistence of a Number published in Journal of Recreational Mathematics 6, 1973, pp. 97-98., 1973) as the number of steps to reach a one-digit

一个基础而奇怪的问题:算法执行加法、乘法、除法性能无区别?

一个基础而奇怪的问题:算法执行加法.乘法.除法性能无区别? 计算机原理分析觉得:加法.乘法和除法的计算性能依次减少,但减少到什么程度? 编写C程序用30次百万数据计算来測试时间差异性,代码例如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i

大数的减法除法

1.除法 1 //反着除 2 //c==0; 3 for(j=len;j>=1;j--) 4 { 5 s=a[j]+c*10; 6 a[j]=s/(i+1); 7 c=s%(i+1); 8 } 9 10 //排除前面的0 11 while(a[i][len]==0) 12 len--; 13 a[0]=len; 2.减法 跟除法的方式类似. 略.

1098: 零起点学算法05——除法算术题

1098: 零起点学算法05--除法算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 2346  Accepted: 1932[Submit][Status][Web Board] Description 乘法会了,除法也一样的.不要跟我说不会哦. Input 没有输入 Output 输出12除以2的值,计算让计算机去做哦 Sample Output 6 Source 零起点学算法 1 #i