日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

图文剖析 big.js 四则运算源码

發(fā)布時間:2023/11/30 windows 44 coder
生活随笔 收集整理的這篇文章主要介紹了 图文剖析 big.js 四则运算源码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

big.js,一個小型、快速的用于任意精度的十進制算術(shù)的JavaScript 庫。

big.js 用于解決平常項目中進行算術(shù)運算時精度丟失引起的結(jié)果不準確的問題。和 big.js 類似的兩個庫 bignumber.js 和 decimal.js 也都是出自同一作者(MikeMcl)之手。

作者在 這里 詳細說明了他們之間的區(qū)別

big.js?是最小的任意精度的計算庫。big.js?是三者中最小也最簡單的,它只有?bignumber.js?一半的方法,不到?bignumber.js?的一半大。

bignumber.js?和?decimal.js?存儲值的進制比?big.js?更高,因此當操作大量數(shù)字時,前兩者的速度會更快。

bignumber.js?可能更適合金融類應用,因為用戶不用擔心丟失精度,除非使用了涉及除法的操作。

這篇文章分別就 big.js 的解析函數(shù),以及加減乘除運算的源碼進行剖析,了解作者的設(shè)計思路。在四則運算的源碼中,相比加減乘,除法運算最為復雜。

用法

創(chuàng)建 Big 對象時,new 操作符是可選的

x = new Big(123.4567)
y = Big('123456.7e-3')                 // 'new' is optional
z = new Big(x)
x.eq(y) && x.eq(z) && y.eq(z)          // true

構(gòu)造函數(shù)

構(gòu)造函數(shù)中關(guān)鍵代碼如下

function Big(n) {
  var x = this;

  // 使用構(gòu)造函數(shù)前面可以不帶 new 關(guān)鍵字
  if (!(x instanceof Big)) return n === UNDEFINED ? _Big_() : new Big(n);

  // 如果傳進來的參數(shù)已經(jīng)是 Big 的實例對象,則復制一份,否則使用 parse 函數(shù)創(chuàng)建一個實例對象
  if (n instanceof Big) {
    x.s = n.s;
    x.e = n.e;
    x.c = n.c.slice();
  } else {
    if (typeof n !== 'string') {
      if (Big.strict === true && typeof n !== 'bigint') {
        throw TypeError(INVALID + 'value');
      }

      // 傳入的如果是 -0 ,則轉(zhuǎn)為字符串表示 '-0'
      n = n === 0 && 1 / n < 0 ? '-0' : String(n);
    }

    parse(x, n);
  }

使用構(gòu)造函數(shù)前面可以不帶 new 關(guān)鍵字

如果傳進來的參數(shù)已經(jīng)是 Big 的實例對象,則將實例對象的屬性復制一份,否則使用 parse 函數(shù)為實例對象創(chuàng)建屬性。

parse 函數(shù)

function parse(x, n) {
    var e, i, nl;

    // NUMERIC = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
    if (!NUMERIC.test(n)) {
      throw Error(INVALID + 'number');
    }

    // Determine sign.
    x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1;

    // Decimal point?
    if ((e = n.indexOf('.')) > -1) n = n.replace('.', '');

    // Exponential form?
    if ((i = n.search(/e/i)) > 0) {

      // Determine exponent.
      if (e < 0) e = i;
      e += +n.slice(i + 1);
      n = n.substring(0, i);
    } else if (e < 0) {

      // Integer.
      e = n.length;
    }

    nl = n.length;

    // Determine leading zeros.
    for (i = 0; i < nl && n.charAt(i) == '0';) ++i;

    if (i == nl) {

      // Zero.
      x.c = [x.e = 0];
    } else {

      // Determine trailing zeros.
      for (; nl > 0 && n.charAt(--nl) == '0';);
      x.e = e - i - 1;
      x.c = [];

      // Convert string to array of digits without leading/trailing zeros.
      for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++);
    }

    return x;
  }

parse 函數(shù)會為實例對象添加三個屬性;

  • x.s,表示數(shù)字的符號,即是正數(shù)還是負數(shù),即正負值,若是正數(shù),x.s = 1,負數(shù)則為 -1
  • x.e,表示數(shù)字對應的指數(shù)表示法的指數(shù),比如 n = 1234 的指數(shù)為 3
  • x.c,數(shù)字數(shù)組,比如 1234 轉(zhuǎn)換后是 [1,2,3,4]
1234 會被轉(zhuǎn)化為 

{
    c:[1,2,3,4],
    e:3,
    s:1
}

這種表示,和 IEEE 754 雙精度浮點數(shù)的存儲方式 很類似,而 JavaScript 的 Number類型就是一個雙精度 64 位二進制格式 IEEE 754?值使用 64 位來表示 3 個部分:

  • 1 位用于表示符號(sign) (正數(shù)或者負數(shù))
  • 11 位用于表示指數(shù)(exponent) (-1022 到 1023)
  • 52 位用于表示尾數(shù)(mantissa) (表示 0 和 1 之間的數(shù)值)

下面分析 parse 函數(shù)轉(zhuǎn)化的詳細過程,以 Big('123400')Big('0.1234')Big('100e2') 為例

注意:Big('100e2') 中 100e2 以字符串形式傳進來才能檢測到 e ,Number形式的 Big(100e2),執(zhí)行 parse 前會被轉(zhuǎn)化為 Big(10000)

  1. 校驗傳入的值,只允許數(shù)字,'.1',指數(shù)形式的寫法。比如 2.34,.2 ,10e2
// NUMERIC = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
if (!NUMERIC.test(n)) {
  throw Error(INVALID + 'number');
}

Big('123400'),Big('-0.1234'),Big('100e2') 都通過
  1. x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1; 確定符號
Big('123400') => x.s = 1
Big('-0.1234') => x.s = -1   并且 -0.1234 => 0.1234
Big('100e2') => x.s = 1
  1. if ((e = n.indexOf('.')) > -1) n = n.replace('.', ''); 是否含有小數(shù)點,如果是,則刪除小數(shù)點,并將 e 的初始值設(shè)為小數(shù)點的位置
Big('123400') => x.e = -1 , n = 123400
Big('-0.1234') => x.e = 1 , n = 01234
Big('100e2') => x.e = -1 , n = 100e2
  1. 如果數(shù)字是科學表示法,比如 100e2 ,e 的位置是 3,e 后面的指數(shù)是 2 ,則 x.e = 3 + 2
if ((i = n.search(/e/i)) > 0) {

  // Determine exponent.
  if (e < 0) e = i;
  e += +n.slice(i + 1);
  n = n.substring(0, i);
} else if (e < 0) {

  // Integer.
  e = n.length;
}


Big('123400') 
x.e = -1  =>  x.e = n.length = 6
n = 123400

Big('-0.1234')
x.e = 1 
n = 01234

Big('100e2')
x.e = -1  =>  x.e = e 在 100e2 中的位置 + e 后面緊跟的指數(shù)系數(shù) = 3 + 2 = 5
n = 100e2  =>  n = 100
  1. nl = n.length; nl 表示傳進來的數(shù)字的長度
Big('123400') 
x.e = 6
n = 123400
nl = 6

Big('-0.1234')
x.e = 1 
n = 01234
nl = 5

Big('100e2')
x.e = 5
n = 100
nl = 3
  1. for (i = 0; i < nl && n.charAt(i) == '0';) ++i; 確定數(shù)字是否有前置 0 ,這里的 i 表示第一個不為 0 的數(shù)字的位置,也可以表示數(shù)字前面有多少個 0
Big('123400') 
x.e = 6
n = 123400
nl = 6
i = 0

Big('-0.1234')
x.e = 1 
n = 01234
nl = 5
i = 1

Big('100e2')
x.e = 5
n = 100
nl = 3
i = 0
  1. 如果 i = nl,則說明傳進來的輸入是一個 0 或者多個 0
if (i == nl) {

  // Zero.
  x.c = [x.e = 0];
} else {

  // 排除尾隨 0,nl 為最后一個不為 0 的數(shù)字的位置
  for (; nl > 0 && n.charAt(--nl) == '0';);
  x.e = e - i - 1;
  x.c = [];

  // 傳進來的數(shù)字,排除掉前置 0 和尾隨 0 后,轉(zhuǎn)換為數(shù)字數(shù)組
  for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++);
}


Big('123400') 
//因為默認 e 是 n.length,而Big指數(shù)表示是 1.234 * 10^5,所以這里 x.e 要減一
x.e = 6  =>  x.e = e - i - 1 = 6 - 0 - 1 = 5  
n = 123400
nl = 6  =>  排除尾隨 0,nl 為最后一個不為 0 的數(shù)字的位置  =>  nl = 3
i = 0
x.c => 選取 n 中從 i 到 nl 的數(shù)字組成數(shù)組 [1,2,3,4]

Big('-0.1234')
x.e = 1  =>  x.e = e - i - 1 = 1 - 1 - 1 = -1 
n = 01234
nl = 5  =>  排除尾隨 0,nl 為最后一個不為 0 的數(shù)字的位置  =>  nl = 4
i = 1
x.c => 選取 n 中從 i 到 nl 的數(shù)字組成數(shù)組 [1,2,3,4]

Big('100e2')
x.e = 5  =>  x.e = e - i - 1 = 5 - 0 - 1 = 4  
n = 100
nl = 3  =>  排除尾隨 0,nl 為最后一個不為 0 的數(shù)字的位置  =>  nl = 0
i = 0
x.c => 選取 n 中從 i 到 nl 的數(shù)字組成數(shù)組 [1]

最后 Big('123400'),Big('-0.1234'),Big('100e2') 將轉(zhuǎn)換為

Big('123400') 
x.s = 1
x.e = 5
x.c = [1,2,3,4]

Big('-0.1234') 
x.s = -1
x.e = -1
x.c = [1,2,3,4]

Big('100e2') 
x.s = 1
x.e = 4
x.c = [1]

至此 parse 函數(shù)邏輯結(jié)束,接下來分別剖析下加減乘除運算;

加法

源碼

P.plus = P.add = function (y) {
    var e, k, t,
      x = this,
      Big = x.constructor;

    y = new Big(y);

    // 校驗符號是否不同
    if (x.s != y.s) {
      y.s = -y.s;
      return x.minus(y);
    }

    var xe = x.e,
      xc = x.c,
      ye = y.e,
      yc = y.c;

    // 校驗是否是 0
    if (!xc[0] || !yc[0]) {
      if (!yc[0]) {
        if (xc[0]) {
          y = new Big(x);
        } else {
          y.s = x.s;
        }
      }
      return y;
    }

    xc = xc.slice();

    // 前面加上零使指數(shù)均衡
    // Note: reverse faster than unshifts.
    if (e = xe - ye) {
      if (e > 0) {
        ye = xe;
        t = yc;
      } else {
        e = -e;
        t = xc;
      }

      t.reverse();
      for (; e--;) t.push(0);
      t.reverse();
    }

    // 讓 xc 存放長度更長的數(shù)字
    if (xc.length - yc.length < 0) {
      t = yc;
      yc = xc;
      xc = t;
    }

    e = yc.length;

    for (k = 0; e; xc[e] %= 10) k = (xc[--e] = xc[e] + yc[e] + k) / 10 | 0;

    // No need to check for zero, as +x + +y != 0 && -x + -y != 0

    if (k) {
      xc.unshift(k);
      ++ye;
    }

    // 刪除尾隨 0
    for (e = xc.length; xc[--e] === 0;) xc.pop();

    y.c = xc;
    y.e = ye;

    return y;
  };
  1. 如果符號不同,則轉(zhuǎn)為減法運算;比如 -x + y 就是 y - x ,x + -y 就是 x - y
if (x.s != y.s) {
  y.s = -y.s;
  return x.minus(y);
}
  1. 其中兩個數(shù)字是不是 0,其中有一個為 0,則直接返回另外一個
if (!xc[0] || !yc[0]) {
  if (!yc[0]) {
    if (xc[0]) {
      y = new Big(x);
    } else {
      y.s = x.s;
    }
  }
  return y;
}
  1. 比較指數(shù)冪差,較小的一方,在前面補零,方便后續(xù)加法操作;并且將指數(shù)冪較大的一方,作為兩數(shù)相加的結(jié)果的指數(shù)冪的初始值。
if (e = xe - ye) {
  if (e > 0) {
    ye = xe; // 將指數(shù)冪較大的一方,作為兩數(shù)相加的結(jié)果的指數(shù)冪的初始值
    t = yc;
  } else {
    e = -e;
    t = xc;
  }

  t.reverse();
  for (; e--;) t.push(0);
  t.reverse();
}

比如 1234 + 12 
1234 在實例對象上是以數(shù)字數(shù)組形式表示 [1,2,3,4]
12 則是 [1,2]
為方便后續(xù)數(shù)組按照位置進行加法運算,這里需要給 12 補零
[1,2,3,4]
    +
[0,0,1,2]
  1. xc 存放長度更長的數(shù)字
if (xc.length - yc.length < 0) {
  t = yc;
  yc = xc;
  xc = t;
}
  1. 接下來是加法邏輯
e = yc.length;

for (k = 0; e; xc[e] %= 10) k = (xc[--e] = xc[e] + yc[e] + k) / 10 | 0;

if (k) {
  xc.unshift(k);
  ++ye;
}

// 刪除尾隨 0
for (e = xc.length; xc[--e] === 0;) xc.pop();

k 保存進位的值

  • 初始化進位值為 0 ,e 為 yc 長度,執(zhí)行下面循環(huán)體
  • (xc[--e] = xc[e] + yc[e] + k) 計算 xc[e] 加上 yc[e] 加上上一次計算結(jié)果進位的值;
  • 隨后 xc[--e] 保存計算后的進位的數(shù)值,e--
  • 最后 xc[e] 保存計算后的個位數(shù)值

上面過程用圖例表示如下

減法

源碼

P.minus = P.sub = function (y) {
    var i, j, t, xlty,
      x = this,
      Big = x.constructor,
      a = x.s,
      b = (y = new Big(y)).s;

    // 確定符號,x - (-y) = x + y    - x - y = -x + (-y)
    if (a != b) {
      y.s = -b;
      return x.plus(y);
    }

    var xc = x.c.slice(),
      xe = x.e,
      yc = y.c,
      ye = y.e;

    // 判斷是否為 0
    if (!xc[0] || !yc[0]) {
      if (yc[0]) {
        y.s = -b;
      } else if (xc[0]) {
        y = new Big(x);
      } else {
        y.s = 1;
      }
      return y;
    }

    // 比較兩數(shù)指數(shù)冪大小,給指數(shù)冪小的一方補零,方便后續(xù)相減;
    // 比如 1234 - 23  parse函數(shù)解析后 => [1,2,3,4] - [2,3]  為了使 [2,3] 對應十位,個位
    // 在前面補 0 ,即 [1,2,3,4] - [0,0,2,3]
    // 再比如 66 - 233  parse函數(shù)解析后 => [6,7] - [2,3,3],同樣為了使 6,7對應十位,個位
    // 在前面補 0 ,即 [0,6,7] - [2,3,3]
    if (a = xe - ye) {

      if (xlty = a < 0) {
        a = -a;
        t = xc;
      } else {
        ye = xe;
        t = yc;
      }

      t.reverse();
      for (b = a; b--;) t.push(0);  // 補零
      t.reverse();
    } else {

      // 若指數(shù)冪相等,不需要補零,則比較兩數(shù)大小,從最大位開始比較;
      // 比如 [2,3,4] 和 [1,2,3] 最大位是百位,若百位的數(shù)字不相等,則可得出孰大孰小
      j = ((xlty = xc.length < yc.length) ? xc : yc).length;

      for (a = b = 0; b < j; b++) {
        if (xc[b] != yc[b]) {
          xlty = xc[b] < yc[b];
          break;
        }
      }
    }
    
    // 對于被減數(shù) x 和減數(shù) y
    // 如果 x - y < 0,則交換兩數(shù),并改變符號;比如 2 - 4 = -(4-2)
    if (xlty) {
      t = xc;
      xc = yc;
      yc = t;
      y.s = -y.s;
    }

    // 如果被減數(shù)的數(shù)字數(shù)組長度小于減數(shù),則給被減數(shù)的末尾添加 0 
    // 比如 12 - 0.0009  parse函數(shù)解析后 => [1,2] - [0,0,0,0,9]
    // 因為 9 是小數(shù)后幾位,相應的需要給 [1,2]末尾補 0 ,即 [1,2,0,0,0] - [0,0,0,0,9]
    if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--;) xc[i++] = 0;

    // 從 xc 中減去 yc
    for (b = i; j > a;) {
      if (xc[--j] < yc[j]) {
        for (i = j; i && !xc[--i];) xc[i] = 9;
        --xc[i];
        xc[j] += 10;
      }

      xc[j] -= yc[j];
    }

    // 去掉運算結(jié)果末尾 0 
    for (; xc[--b] === 0;) xc.pop();

    // 去掉運算結(jié)果前置 0 ,并減去相應指數(shù)冪
    for (; xc[0] === 0;) {
      xc.shift();
      --ye;
    }

    // 運算結(jié)果為 0 的情況
    if (!xc[0]) {

      // n - n = +0
      y.s = 1;

      xc = [ye = 0];
    }

    y.c = xc;
    y.e = ye;

    return y;
  };

減法前面的邏輯和加法類似,這里不再贅述,已在上面代碼注釋中說明,下面是減法的核心邏輯

// 從 被減數(shù) xc 中減去減數(shù) yc
// a 是 xc 和 yc 的冪的差值,j 是 yc 的長度,這里循環(huán)條件用 j > a,表示循環(huán) j-a 次
// 比如 120 - 9  =>  [1,2,0]-[0,0,9] 指數(shù)冪差是 2 ,減數(shù)數(shù)字數(shù)組長度是 3 ,則只需要循環(huán) 3-2=1 次
// 比如 120 - 0.009 => [1,2,0,0,0,0]-[0,0,0,0,0,9] 指數(shù)冪差是 5 ,減數(shù)數(shù)字數(shù)組長度是 6 ,則只需要循環(huán) 6-5=1 次
for (b = i; j > a;) { 
  if (xc[--j] < yc[j]) {
  //從后往前遍歷xc,當碰到值為0 ,將值改為 9;
  //比如 [1,0,0]-[0,0,9] => [0,9,10] -
    for (i = j; i && !xc[--i];) xc[i] = 9; 
    --xc[i];
    xc[j] += 10;
  }

  xc[j] -= yc[j];
}

上面過程用圖例表示如下,xc 表示被減數(shù),yc 表示減數(shù)

1、若 xc 末尾項大于等于 yc 末尾項,比如 [1,2,3]和[0,0,2],則直接相減。

2、若 xc 末尾項小于 yc 末尾項,則執(zhí)行以下邏輯

for (i = j; i && !xc[--i];) xc[i] = 9;

上面代碼表示從 當前進行相減運算的元素的位置(j) 往前遍歷被減數(shù) xc 每個元素,當元素值為 0 時,將值改為 9,直至上一個元素值不為 0 ,循環(huán)結(jié)束。

至此,減法邏輯結(jié)束。

乘法

源碼

P.times = P.mul = function (y) {
    var c,
      x = this,
      Big = x.constructor,
      xc = x.c,
      yc = (y = new Big(y)).c,
      a = xc.length,
      b = yc.length,
      i = x.e,
      j = y.e;

    // 確定結(jié)果的符號
    y.s = x.s == y.s ? 1 : -1;

    // 其中一個為 0 ,返回結(jié)果為 0
    if (!xc[0] || !yc[0]) {
      y.c = [y.e = 0];
      return y;
    }

    // 初始化結(jié)果的指數(shù)
    y.e = i + j;

    // 對比 xc,yc 長度,xc 存放長度更長的一方
    if (a < b) {
      c = xc;
      xc = yc;
      yc = c;
      j = a;
      a = b;
      b = j;
    }

    // 用 0 初始化結(jié)果數(shù)組
    for (c = new Array(j = a + b); j--;) c[j] = 0;

    // i is initially xc.length.
    for (i = b; i--;) {
      b = 0;

      // a is yc.length.
      for (j = a + i; j > i;) {

        // Current sum of products at this digit position, plus carry.
        b = c[j] + yc[i] * xc[j - i - 1] + b;
        c[j--] = b % 10;

        // carry
        b = b / 10 | 0;
      }

      c[j] = b;
    }

    // 如果有最終進位,則增加結(jié)果的指數(shù),否則刪除頭部的 0
    if (b) ++y.e;
    else c.shift();

    // 刪除尾部的 0
    for (i = c.length; !c[--i];) c.pop();
    y.c = c;

    return y;
  };

乘法源碼的主要邏輯是下面這一段

for (i = b; i--;) {
  b = 0;

  for (j = a + i; j > i;) {

    // 當前數(shù)字位置的總和,加上進位
    b = c[j] + yc[i] * xc[j - i - 1] + b;
    c[j--] = b % 10;

    // 進位值
    b = b / 10 | 0;
  }

  c[j] = b;
}

描述的其實就是以前老師教我們在紙上乘法運算的過程:

123*12 來舉例子分析上面這段代碼

  • xc 是乘數(shù) [1,2,3],yc 是被乘數(shù) [1,2],b 是 yc 長度,a 是 xc 長度

  • c 是保存結(jié)果的數(shù)組,定義的長度是 a+b

兩個數(shù)相乘得到的結(jié)果長度可能是 a+b,也有可能是 a+b-1。所以后面需要刪除數(shù)組頭部的 0

  1. for (i = b; i--;) 首先是外層循環(huán),從數(shù)組長度較短的被乘數(shù)開始循環(huán),將 b 賦值給 i,i 充當 yc 的長度,而 b 用來保存進位的值
  2. b = 0 定義進位的值
  3. for (j = a + i; j > i;) 內(nèi)層乘數(shù)(123)的循環(huán),這里的 j 表示在結(jié)果數(shù)組 c 中的位置

for (j = a + i; j > i;) 實際上就是 for ( j = 乘數(shù)長度 + 當前被乘數(shù)數(shù)字的位置 ),這里是因為當?shù)诙喭鈱友h(huán)時,123 * 1 的時候,1 是 12 的 十位,所以在 j 也應該從十位開始保存計算結(jié)果。

第一輪外層循環(huán)

第二輪外層循環(huán)

  1. b = c[j] + yc[i] * xc[j - i - 1] + b 當前數(shù)字位置的總和,加上進位

  1. c[j--] = b % 10; 當前位置去整取余
  2. b = b / 10 | 0; 進位值取整

至此乘法運算邏輯結(jié)束

除法

源碼

P.div = function (y) {
    var x = this,
      Big = x.constructor,
      a = x.c,                  // dividend
      b = (y = new Big(y)).c,   // divisor
      k = x.s == y.s ? 1 : -1,
      dp = Big.DP;

    if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {
      throw Error(INVALID_DP);
    }

    // Divisor is zero?
    if (!b[0]) {
      throw Error(DIV_BY_ZERO);
    }

    // Dividend is 0? Return +-0.
    if (!a[0]) {
      y.s = k;
      y.c = [y.e = 0];
      return y;
    }

    var bl, bt, n, cmp, ri,
      bz = b.slice(),
      ai = bl = b.length,
      al = a.length,
      r = a.slice(0, bl),   // remainder
      rl = r.length,
      q = y,                // quotient
      qc = q.c = [],
      qi = 0,
      p = dp + (q.e = x.e - y.e) + 1;    // precision of the result

    q.s = k;
    k = p < 0 ? 0 : p;

    // Create version of divisor with leading zero.
    bz.unshift(0);

    // Add zeros to make remainder as long as divisor.
    for (; rl++ < bl;) r.push(0);

    do {

      // n is how many times the divisor goes into current remainder.
      for (n = 0; n < 10; n++) {

        // Compare divisor and remainder.
        if (bl != (rl = r.length)) {
          cmp = bl > rl ? 1 : -1;
        } else {
          for (ri = -1, cmp = 0; ++ri < bl;) {
            if (b[ri] != r[ri]) {
              cmp = b[ri] > r[ri] ? 1 : -1;
              break;
            }
          }
        }

        // If divisor < remainder, subtract divisor from remainder.
        if (cmp < 0) {

          // Remainder can't be more than 1 digit longer than divisor.
          // Equalise lengths using divisor with extra leading zero?
          for (bt = rl == bl ? b : bz; rl;) {
            if (r[--rl] < bt[rl]) {
              ri = rl;
              for (; ri && !r[--ri];) r[ri] = 9;
              --r[ri];
              r[rl] += 10;
            }
            r[rl] -= bt[rl];
          }

          for (; !r[0];) r.shift();
        } else {
          break;
        }
      }

      // Add the digit n to the result array.
      qc[qi++] = cmp ? n : ++n;

      // Update the remainder.
      if (r[0] && cmp) r[rl] = a[ai] || 0;
      else r = [a[ai]];

    } while ((ai++ < al || r[0] !== UNDEFINED) && k--);

    // Leading zero? Do not remove if result is simply zero (qi == 1).
    if (!qc[0] && qi != 1) {

      // There can't be more than one zero.
      qc.shift();
      q.e--;
      p--;
    }

    // Round?
    if (qi > p) round(q, p, Big.RM, r[0] !== UNDEFINED);

    return q;
  };

在除法運算中,對于 a/b , a 是被除數(shù),b 是除數(shù),下面依次分析上面代碼

  1. if (dp !== ~~dp || dp < 0 || dp > MAX_DP) 判斷 dp 是不是大于 0 的整數(shù),并且小于 MAX_DP,這里的 dp 可以自己設(shè)置
Big.DP = 30
  1. 除數(shù)為 0 則拋出錯誤。
if (!b[0]) {
  throw Error(DIV_BY_ZERO);
}
  1. 被除數(shù)是 0 則返回值為 0 的實例對象
if (!a[0]) {
  y.s = k;
  y.c = [y.e = 0];
  return y;
}
  1. 接下來是除法運算邏輯,定義變量的那一段不貼了,直接看 do while 循環(huán)
do {

  // n 是循環(huán)次數(shù),表示從當前位置的余數(shù)中可以分出多少個除數(shù)來,也就是當前位置的商。
  for (n = 0; n < 10; n++) {

    // 比較除數(shù)和余數(shù)大小
    if (bl != (rl = r.length)) {
      cmp = bl > rl ? 1 : -1;
    } else {
      for (ri = -1, cmp = 0; ++ri < bl;) {
        if (b[ri] != r[ri]) {
          cmp = b[ri] > r[ri] ? 1 : -1;
          break;
        }
      }
    }

    // 除數(shù)小于余數(shù),則繼續(xù)從余數(shù)中減去除數(shù)
    if (cmp < 0) {

      // Remainder can't be more than 1 digit longer than divisor.
      // Equalise lengths using divisor with extra leading zero?
      for (bt = rl == bl ? b : bz; rl;) {
        if (r[--rl] < bt[rl]) {
          ri = rl;
          for (; ri && !r[--ri];) r[ri] = 9;
          --r[ri];
          r[rl] += 10;
        }
        r[rl] -= bt[rl];
      }

      for (; !r[0];) r.shift();
    } else {
      break;
    }
  }

  // qc 數(shù)組保存商
  qc[qi++] = cmp ? n : ++n;

  // 更新余數(shù)
  if (r[0] && cmp) r[rl] = a[ai] || 0;
  else r = [a[ai]];

} while ((ai++ < al || r[0] !== UNDEFINED) && k--);

這個循環(huán)做了這些事情:以 1234 / 9 為例;

  • 將當前位置的余數(shù) 1 和除數(shù) 9 比較大小,(一開始余數(shù)取的是被除數(shù)的前面 n 位,n 和除數(shù)的長度大小相同,所以取的是 1 )。先比較長度,長度相同再比較大小。
  • 若除數(shù)大于當前位置余數(shù),則跳出循環(huán)(當前循環(huán)次數(shù)即為當前位置的商,9 > 1 ,那么當前循環(huán)次數(shù)為 0 ,即當前位置商為 0 )
  • 然后保存商 qc[qi++] = cmp ? n : ++n;
  • 最后更新當前余數(shù),除數(shù)大于余數(shù)時,則當前余數(shù)向后借一位,余數(shù)就由 1 變?yōu)榱?12
if (r[0] && cmp) r[rl] = a[ai] || 0;
  else r = [a[ai]];
  • 若除數(shù)小于當前余數(shù),則繼續(xù)從余數(shù)中減去除數(shù) (開始減法 for 循環(huán))

  • 然后再次保存商 qc[qi++] = cmp ? n : ++n;
  • 然后再次更新當前余數(shù),除數(shù)大于余數(shù)時,則當前余數(shù)向后借一位,余數(shù)就由 3 變?yōu)榱?33
  • 當商數(shù)組的長度沒有達到指定的精度總和,繼續(xù)上面的步驟,直至循環(huán)結(jié)束;

指定的精度總和指的是 Big.DP(默認20) + (被除數(shù)的指數(shù)-除數(shù)的指數(shù)); 1234 / 9 的指定精度總和是 23。

  1. 商數(shù)組長度大于 1 的情況下,刪除數(shù)組前面的 0 ;如果是 商就是 0 ,比如 0/1 = 0,這種情況不必刪除 0 了
 if (!qc[0] && qi != 1) {
  qc.shift();
  q.e--;
  p--;
}
  1. 舍入操作 if (qi > p) round(q, p, Big.RM, r[0] !== UNDEFINED);

至此除法邏輯結(jié)束

注意事項

big.js 用數(shù)組存儲值,類似 高精度計算,只不過 big.js 是數(shù)組中每個位置存儲一個值,然后對每個位置進行運算;而對超級大的數(shù)字(數(shù)百或數(shù)千位數(shù)值時),big.js 算術(shù)運算不如 bignumber.js 快。

例如,bignumber.js 將數(shù)字1234.56789的數(shù)字存儲為[1234,56789000000000] ,即以兩個1e14為基數(shù)的數(shù)組形式存儲,而 big.js 存儲的數(shù)字與[1,2,3,4.5,6,7,8,9]相同,即以9個10為基數(shù)的數(shù)組形式存儲。前者的算術(shù)運算可能更快,因為需要處理的元素較少。在實踐中,這可能只有在使用數(shù)百或數(shù)千位數(shù)值時才會有所不同。

在使用 big.js 進行運算時需要注意有時候沒有設(shè)置足夠大的精度,會導致結(jié)果不是想要的。

Big.DP = 20
+Big(1).div('11111111').times('11111111') // 0.9999999999999999
// 0.9999999999999999 在 Number 編碼的可以表示的準確精度范圍內(nèi)

Big.DP = 30
+Big(1).div('11111111').times('11111111') // 1
// 而設(shè)置 Big.DP = 30 后
//結(jié)果數(shù)組保存的是 999999999999999999999999
//超過了 Number 編碼的可以表示的準確精度范圍,則會舍入為 1

總結(jié)

本文剖析了 big.js 解析函數(shù)源碼,四則運算源碼,分別用圖文詳細描述了運算過程,一步步還原了作者的構(gòu)思。有不正確的地方或者不同見解還請各位大佬提出來。

總結(jié)

以上是生活随笔為你收集整理的图文剖析 big.js 四则运算源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

成人免费在线观看av | 精品国产区在线 | 国产热re99久久6国产精品 | 久久精品日韩 | 亚洲国产激情 | 国产精品久久久久一区二区三区 | 久久影视一区二区 | 亚洲国产偷 | av在线看片 | 久久久久亚洲精品中文字幕 | 天天曰天天射 | 日韩欧美视频一区二区 | 亚洲国产97在线精品一区 | 91精品国产91热久久久做人人 | 国产精品国产三级国产不产一地 | 五月婷激情| 久久久久国产一区二区三区四区 | 免费看精品久久片 | 香蕉视频在线免费看 | 美女av免费看 | 五月婷丁香网 | 在线观看视频国产 | 西西44人体做爰大胆视频 | 日韩国产在线观看 | 天堂av影院 | 日韩电影在线一区 | 91最新网址在线观看 | 91精品免费 | 在线电影 你懂得 | 超碰97久久 | 久久久影院 | 亚洲视频电影在线 | 最新国产中文字幕 | 人人添人人澡人人澡人人人爽 | 欧美午夜理伦三级在线观看 | 91九色国产| 成人免费网站视频 | 在线观看中文字幕av | 日韩电影一区二区三区在线观看 | 九热精品| 521色香蕉网站在线观看 | 99亚洲精品在线 | 免费在线观看av电影 | 97在线免费视频 | 欧美一区二视频在线免费观看 | 国产成人精品在线播放 | 日韩专区一区二区 | 美女黄频 | av电影免费在线播放 | 欧美一区二区三区四区夜夜大片 | 在线免费亚洲 | 欧美日韩视频在线 | 亚洲男男gaygayxxxgv| 欧美成人精品三级在线观看播放 | 免费看在线看www777 | 中文字幕精品www乱入免费视频 | 日韩美女免费线视频 | 精品国产亚洲一区二区麻豆 | 亚洲精品午夜aaa久久久 | 午夜精品视频在线 | 18做爰免费视频网站 | 六月激情丁香 | 天天操婷婷 | 亚洲一区免费在线 | 天天操,夜夜操 | 成人免费观看网站 | 国产黄色视 | 国产这里只有精品 | 国产成人精品国内自产拍免费看 | 欧美了一区在线观看 | 日韩区在线观看 | 国产精品一区免费在线观看 | 国产成人三级在线播放 | 亚洲精品久久久久久久不卡四虎 | 免费在线观看av网址 | 黄色小说在线观看视频 | 日韩高清一区在线 | 欧美精彩视频在线观看 | a黄色大片 | 精品久久一二三区 | 日本天天色 | 国产不卡av在线播放 | 久久久久亚洲精品国产 | 蜜臀久久99静品久久久久久 | 六月丁香婷婷在线 | 国产成人精品一区一区一区 | 亚洲国产精品久久久久婷婷884 | 高清精品视频 | 欧美日本国产在线观看 | 91精品国产乱码久久 | 日韩有码网站 | 国产一区在线播放 | 国产精品久久久久久久久蜜臀 | 中文av在线免费观看 | 黄色的网站免费看 | 日本中文字幕网址 | 国产少妇在线观看 | 久久久国产日韩 | av福利网址导航大全 | 亚洲欧美综合 | 91精品一区二区三区久久久久久 | 久久精品一区八戒影视 | 国产成人免费精品 | 天天色天天射天天干 | 天天综合网国产 | 午夜免费电影院 | 玖玖玖国产精品 | 成人一级片免费看 | 91视频专区| 亚洲成人国产精品 | 日韩av一区二区三区在线观看 | 蜜臀av夜夜澡人人爽人人桃色 | 一区二区三区电影大全 | 午夜免费在线观看 | 色婷婷影视 | 国产资源免费在线观看 | 在线之家免费在线观看电影 | 欧美一级专区免费大片 | 亚洲理论电影网 | 91九色蝌蚪视频 | 国产精品18久久久久久久久 | 中文字幕色婷婷在线视频 | 精品国产一区二区三区四 | 精品国产美女在线 | 91av视频在线观看免费 | 久久不见久久见免费影院 | 韩国三级在线一区 | 黄色免费在线视频 | 国产丝袜制服在线 | 毛片网站免费在线观看 | 国产色区 | 日本中文在线观看 | 又粗又长又大又爽又黄少妇毛片 | 91精品视频在线看 | 国产精品青草综合久久久久99 | 99re久久资源最新地址 | 欧美久久久| 狠狠干夜夜操天天爽 | 精品专区| 亚洲一级片在线观看 | 在线观看免费 | 精品一区二区在线看 | 亚州日韩中文字幕 | 麻豆视频一区 | 开心激情久久 | 国产综合视频在线观看 | 亚洲精品国产精品乱码不99热 | 国产精品刺激对白麻豆99 | 国产精品一区在线 | 日日摸日日 | 精品一区二区久久久久久久网站 | 人人爽人人爽人人片 | 婷婷综合 | 久久99深爱久久99精品 | 人人狠狠综合久久亚洲婷 | 免费黄色看片 | 国产精品99久久久久的智能播放 | 国产理论在线 | 欧美孕妇与黑人孕交 | 91福利社在线观看 | 九九99靖品 | 久久精品欧美一 | 日韩欧美一二三 | 色综合天天色综合 | 99视频一区 | 黄a网| 日韩av网站在线播放 | av品善网| 久久综合电影 | 天天干天天草天天爽 | 最新日韩在线观看 | 日韩三级中文字幕 | 黄色亚洲在线 | 欧美日韩综合在线观看 | 日韩免费高清在线观看 | 最近免费观看的电影完整版 | 91豆花在线观看 | 久久精品首页 | 欧美日韩亚洲精品在线 | 中文字幕 国产视频 | 国产日产高清dvd碟片 | 欧美久久久久久久 | 激情网五月 | 激情小说久久 | 天天躁天天操 | 日本在线观看中文字幕无线观看 | 五月婷婷操 | 96久久久| 蜜臀av性久久久久蜜臀aⅴ流畅 | 成人理论在线观看 | 久久久一本精品99久久精品66 | 成人久久久电影 | 亚洲精品乱码久久久久久蜜桃91 | 久久国产品 | 国产一级二级在线播放 | 日本爱爱免费视频 | 少妇精品久久久一区二区免费 | 久久桃花网 | 欧美日韩国产高清视频 | 黄色在线观看免费 | 久久免费视频一区 | 国产激情小视频在线观看 | 天天操天天草 | 麻豆94tv免费版 | 久久精品久久精品久久精品 | wwwwwww色| 免费日韩av片 | 天堂va在线高清一区 | 国产一区在线视频观看 | 亚洲视频第一页 | 久久综合影院 | 国产在线观 | 亚洲精品国产精品乱码不99热 | 高清精品在线 | 成人av在线影院 | 久久久久久久综合色一本 | 欧美日韩在线免费视频 | 国产精品久久久视频 | 日韩在观看线 | 玖玖999 | 一区二区不卡视频在线观看 | 亚洲一级影院 | 日日麻批40分钟视频免费观看 | 亚州av网站 | 白丝av免费观看 | av在线超碰| 91看片淫黄大片一级在线观看 | 九九免费精品视频在线观看 | 婷婷久久国产 | 日韩综合一区二区 | 中文字幕一区二区三区四区 | 亚洲香蕉在线观看 | 成人一区二区三区在线 | 亚洲精品免费在线观看 | а中文在线天堂 | 久久精品欧美视频 | 美女精品国产 | 天天做日日做天天爽视频免费 | www.夜夜骑.com | 在线观看的黄色 | 人人玩人人添人人 | 国产一区视频在线观看免费 | 91秒拍国产福利一区 | 色综合a| 精品国产乱码久久久久久1区二区 | 国产黄视频在线观看 | 国产精品人成电影在线观看 | 一区三区视频 | 免费看片成人 | 国产精品国产精品 | 婷婷综合在线 | 久久在线观看视频 | 色香蕉网 | 亚洲精品国产精品国产 | 亚洲人成人在线 | 亚洲精品自拍视频在线观看 | 最近的中文字幕大全免费版 | 国产一区二区在线免费观看 | 黄色国产大片 | 国产成人精品不卡 | 亚洲成av人片在线观看香蕉 | 国产高清精 | av电影免费 | 免费黄在线观看 | 亚洲成av人片一区二区梦乃 | 免费日韩在线 | 久久久久久久久久久免费视频 | 天天天天天操 | 91传媒在线 | 免费看一级黄色 | 美女福利视频在线 | 视频91| 久久精视频| 天堂资源在线观看视频 | 久久成人午夜视频 | 狂野欧美激情性xxxx欧美 | 日韩精品专区 | 久久亚洲影视 | 91精彩视频在线观看 | 国产 一区二区三区 在线 | 欧美一级免费 | 国产免费观看高清完整版 | 色婷婷a| 国产福利在线免费 | 日韩精品一区二区三区水蜜桃 | 国产在线视频导航 | 少妇bbw撒尿 | 国产精品精品久久久久久 | 在线免费观看国产视频 | 91精品久久久久久 | 久久视频6 | 色综合 久久精品 | 在线视频观看成人 | 91av视频在线观看 | 国内丰满少妇猛烈精品播 | 在线日韩一区 | 天天爽夜夜爽人人爽曰av | 欧美一区二区三区免费看 | 一级淫片a| 亚洲1区在线 | 丁香激情综合国产 | 日韩久久精品一区二区 | 91黄色在线观看 | 日韩午夜在线播放 | 综合久久久久久久久 | 亚洲精品tv久久久久久久久久 | 国产精品一区二区三区在线播放 | 99精品国产高清在线观看 | 中国一级片视频 | 91亚洲夫妻| 国产精品久久亚洲 | 国产精品综合久久久久久 | 亚洲日韩欧美一区二区在线 | 国产精品激情 | 正在播放一区二区 | 一区二区三区在线视频观看58 | 久久免费视频一区 | 免费在线黄色av | 中文字幕第 | 亚洲日本va午夜在线电影 | 97国产一区二区 | 久久久久国产精品免费网站 | 精品在线观看一区二区三区 | 国产美女免费 | 天天综合区 | 国产免费视频一区二区裸体 | 国产精品久久久久久爽爽爽 | 日韩精品视频免费在线观看 | 国产在线观看免 | 三级黄色片在线观看 | 去看片| 日韩国产欧美在线播放 | 99爱视频 | 久久99精品热在线观看 | 高清免费在线视频 | 亚洲精品欧美成人 | 又黄又爽又刺激视频 | 深夜免费福利视频 | 三级视频国产 | 波多野结衣精品 | 97超碰资源| 婷婷久久丁香 | 久色网 | 九九免费观看全部免费视频 | 国产视频一级 | 中文字幕 第二区 | 国产经典三级 | 99re国产 | 黄色免费高清视频 | 久久久久久久久久久网 | 国产精品嫩草影院123 | 欧美一二三区在线观看 | 久久午夜视频 | 91精品1区 | 99午夜| 亚洲另类视频 | 欧洲精品久久久久毛片完整版 | 国产精品av在线 | 亚洲国产精品资源 | 国产高清视频网 | 色黄www小说 | 成人免费视频播放 | 亚洲国产精品一区二区久久hs | 波多野结衣电影一区二区 | 国产精品美女久久久久久久久久久 | 狠狠色丁香久久婷婷综合_中 | av在线免费网站 | 国产成人av免费在线观看 | 三级av片 | 黄色软件在线看 | 亚洲高清91 | 97在线视频免费观看 | 国产你懂的在线 | 欧美激情视频在线免费观看 | 日韩在线一区二区免费 | 久草视频在线观 | 国产偷在线 | 成人黄色免费观看 | 欧美一级片在线免费观看 | 97色在线视频 | 亚洲高清视频在线播放 | 伊色综合久久之综合久久 | 夜夜夜夜爽 | 色综合www | 欧美狠狠操 | 久草在线91 | 久久久美女 | 久草在线最新免费 | 精品免费久久 | 国产黄色精品视频 | 91久久精品一区二区三区 | 91麻豆免费视频 | 亚洲一区二区三区毛片 | 麻豆果冻剧传媒在线播放 | 国产精品va最新国产精品视频 | 91精品一区二区三区蜜桃 | 国产在线一区观看 | 日韩中午字幕 | 天天插夜夜操 | 久久久国产99久久国产一 | 成人蜜桃| 日韩天天干| 亚洲精品久久久久中文字幕m男 | 久久久久国产成人精品亚洲午夜 | 99视频在线观看视频 | 黄色三级网站 | 久久在线播放 | 久久精品一区二区三区中文字幕 | 国产精品区在线观看 | 五月婷婷六月丁香激情 | 国内久久 | 亚洲精品美女在线观看播放 | 黄色在线网站噜噜噜 | 免费av在| 欧美一区二区三区激情视频 | 亚洲成a人片在线www | 日韩中文字幕视频在线 | 日本特黄特色aaa大片免费 | 91麻豆精品国产91久久久更新时间 | 五月激情久久 | 69av久久 | 男女男视频 | 成人国产精品久久久 | 国产精品国产三级国产aⅴ无密码 | 色婷婷一 | 九九九九九九精品 | 不卡中文字幕av | 国产在线视频一区二区三区 | 亚洲精品456在线播放乱码 | 精品99在线| 欧美精品免费在线观看 | 欧美一级专区免费大片 | 亚洲欧洲日韩 | 精品视频123区在线观看 | 国产精品一区二区免费看 | 天天操天天吃 | 久久国产精品免费观看 | 日韩欧美视频免费在线观看 | 日韩欧美v| 久久久国产电影 | 伊人天天干 | 日本久久视频 | 激情五月开心 | 亚洲精品午夜久久久久久久 | 丁香在线观看完整电影视频 | 久久精品99国产精品酒店日本 | 99热播精品| 国产午夜一级毛片 | 美女久久久久久久久久久 | 亚洲精品人人 | 中文在线最新版天堂 | 亚洲精品在线观看网站 | 天天色天天干天天色 | 中文字幕一区二区三区四区久久 | 久久精品网站免费观看 | 亚洲码国产日韩欧美高潮在线播放 | 992tv在线| 亚洲欧美日韩精品久久久 | 在线精品视频免费播放 | 欧美a级一区二区 | 日韩美女免费线视频 | 日本久久久精品视频 | 日日摸日日添夜夜爽97 | 六月丁香婷婷久久 | 国产精品久久久久久久av电影 | 黄色三级在线看 | 国产精品欧美久久久久无广告 | 欧美午夜寂寞影院 | 精品国产精品久久一区免费式 | 日日夜夜天天人人 | 亚洲欧美视频在线观看 | 色婷婷一 | 久久久久久久久久久久久久免费看 | 中文字幕亚洲欧美日韩 | 日韩精品一区电影 | 永久av免费在线观看 | 草久久久 | 日韩精品中文字幕在线 | 午夜精品麻豆 | 国产黑丝一区二区三区 | 欧美伦理一区二区 | 日韩欧美高清在线观看 | 欧美性生活小视频 | 国产精品99久久久久人中文网介绍 | 国产精品1024 | 黄色a视频| 四虎在线永久免费观看 | 九九九电影免费看 | 亚洲国产成人在线观看 | 亚洲欧美视频在线观看 | av网址aaa| 国产精品一区在线观看你懂的 | 久操中文字幕在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 在线黄av | 在线导航av | 91激情视频在线观看 | 97超碰色| 91社区国产高清 | 69中文字幕| 色噜噜在线观看视频 | 成人片在线播放 | 久久久性| 亚洲国产精品久久久 | 久久一线 | 日日成人网 | 欧美男同网站 | 国产福利精品视频 | 久射网 | 激情中文在线 | 91c网站色版视频 | 国内精品久久久久久久久久清纯 | 欧美在线观看视频一区二区 | 久久久色 | 久草观看 | 国产成人一区二区啪在线观看 | 综合激情婷婷 | 国产精品久久久久久久久久久久 | 免费在线观看一级片 | 四虎国产精 | 狠狠做深爱婷婷综合一区 | 久草精品在线播放 | 日韩在线观看 | 国产精品va最新国产精品视频 | 成人免费观看电影 | 久久精品99| 欧美a视频| 99色婷婷 | 久久免费在线观看视频 | 欧美日韩国产一区二区三区在线观看 | 亚洲va欧美va人人爽春色影视 | 91精品一区二区三区蜜桃 | av免费电影在线观看 | 欧美国产日韩激情 | 中文字幕乱码在线播放 | 美女久久久久 | 成人h动漫精品一区二 | 99久久精品免费 | 一本一道波多野毛片中文在线 | 久久国产a | 黄色电影小说 | 一区二区三区观看 | 免费黄色激情视频 | 国产精品久久久影视 | 最近中文字幕完整视频高清1 | 欧美日韩午夜在线 | 97超碰人人模人人人爽人人爱 | 一区中文字幕在线观看 | 午夜精品久久久久久久99水蜜桃 | 黄网站色成年免费观看 | 国产精品免费一区二区 | 最近中文字幕mv | 色婷在线 | 欧美日韩精品影院 | 激情综合网五月 | 91在线视频观看免费 | 最近中文字幕免费av | 国产精品成人一区二区三区吃奶 | 久久久久久网 | 91禁在线观看 | 免费高清在线观看电视网站 | 99精品视频在线观看视频 | 精品久久久精品 | 国产精品视频区 | 成人精品999 | 中文字幕的 | av免费网 | 国产不卡在线观看 | 久久ww| 成片免费观看视频 | 操操操日日日干干干 | 国产精选在线观看 | 午夜精品福利一区二区 | 久久亚洲欧美日韩精品专区 | 丁香五香天综合情 | 亚洲成人在线免费 | 久草精品资源 | 久久五月天色综合 | 51精品国自产在线 | 欧美日韩中文字幕在线视频 | 在线播放视频一区 | 精品久久久久亚洲 | 国产精品女人久久久 | 天天弄天天操 | 国产一区二区三区高清播放 | 国产最顶级的黄色片在线免费观看 | 天天操狠狠操网站 | 成人免费观看网站 | 婷婷资源站 | 亚洲精品美女久久久久网站 | 亚洲最新av网站 | 天天干天天草天天爽 | 三级黄色片在线观看 | 激情五月开心 | 狠狠色伊人亚洲综合成人 | 国产色中涩| 久久久久免费精品视频 | av官网 | 国产视频欧美视频 | 国产九色视频在线观看 | 国产精品欧美一区二区三区不卡 | 国内丰满少妇猛烈精品播放 | 国产a级免费 | 久久伊人操 | 天天射综合| 久久免费电影网 | 婷婷色网址 | 国产99re | www.久久免费视频 | 成人久久18免费网站麻豆 | 亚洲日本中文字幕在线观看 | 欧美十八| 九九九热精品 | 欧美视频国产视频 | 色综合国产 | 日韩精品久久久久久久电影99爱 | 色婷婷播放 | 波多野结衣电影一区 | 91精品国产自产在线观看永久 | 美女亚洲精品 | www.久艹 | 成人资源在线播放 | 丁香婷婷激情国产高清秒播 | 久久久久免费精品 | 亚洲三级黄色 | 女人久久久久 | 国产精品99久久久 | 在线免费观看黄色大片 | 国产精品久久一区二区无卡 | 93久久精品日日躁夜夜躁欧美 | 996久久国产精品线观看 | 99精品视频在线看 | 一区二区三区免费在线观看视频 | 一级黄色片网站 | 久久免费在线视频 | 国产午夜精品一区二区三区嫩草 | 四虎影视成人精品国库在线观看 | 亚洲国产成人精品电影在线观看 | 亚洲精品成人在线 | 国产一级黄色免费看 | 五月天电影免费在线观看一区 | 中文字幕在线一区二区三区 | 色成人亚洲 | 四虎视频 | 国产在线一卡 | 射射色| 91网站在线视频 | 国产电影黄色av | 亚洲精品国偷拍自产在线观看蜜桃 | 日本中文字幕系列 | 日韩电影一区二区三区在线观看 | 丁香六月婷婷开心 | 又黄又爽又色无遮挡免费 | 国产精品久久久久永久免费看 | 91亚洲视频在线观看 | 日韩免费观看高清 | 国产精品中文字幕在线播放 | 狠狠色丁香婷综合久久 | av一二三区| 久久夜视频 | 国产在线污 | 99九九99九九九视频精品 | 成人一区二区在线观看 | 久久婷婷亚洲 | 国产一级视频在线免费观看 | 一本一本久久a久久精品综合小说 | 成人久久视频 | 亚洲影院天堂 | www.在线看片.com | 国产欧美三级 | 久久你懂得 | 国产精品日韩在线播放 | 黄色大片免费播放 | 色www永久免费 | 中文国产字幕在线观看 | 免费在线观看成年人视频 | 亚洲精品乱码久久久久久写真 | 99热精品在线 | 欧美日韩不卡在线观看 | 国产不卡精品 | 免费观看国产精品 | av电影在线观看完整版一区二区 | 热精品| 欧美综合久久久 | 久久99日韩 | 色婷婷国产精品一区在线观看 | 色综合天天综合 | 天天爽夜夜爽人人爽曰av | 91精品国产综合久久婷婷香蕉 | 丁香五香天综合情 | 国模精品一区二区三区 | 在线观看国产 | 亚洲激情视频 | 在线视频久 | a色网站| 99精品视频精品精品视频 | 香蕉视频4aa | 精品国产综合区久久久久久 | 日韩中字在线观看 | 国产精品99久久久精品免费观看 | 国产亚洲精品bv在线观看 | 欧洲不卡av | 亚洲aⅴ乱码精品成人区 | 免费男女羞羞的视频网站中文字幕 | 中文字幕中文字幕在线一区 | 四季av综合网站 | 日韩二区三区在线观看 | 天天伊人网 | 国产麻豆视频 | 欧美日韩精品免费观看 | 欧美一区二区三区不卡 | 成人小视频在线免费观看 | 免费一级黄色 | 久久av影视 | 国产视频1 | 国产99色 | 午夜精品一区二区三区在线观看 | 久久精品欧美一 | 国产xvideos免费视频播放 | 日韩偷拍精品 | 免费碰碰 | 久久精品96 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产精品电影在线 | 欧美精品一区二区免费 | 日韩精品一区二区免费 | 2021国产在线视频 | 97av视频| 激情网色| 久久久污 | 高清av在线免费观看 | 二区中文字幕 | 久久国产精品视频 | 国产午夜三级一区二区三桃花影视 | 日本丰满少妇免费一区 | 久久经典视频 | 国产日本亚洲高清 | 精品久久久久久久久久久久久 | av福利在线免费观看 | 日韩精品一区二区在线视频 | 国产一级淫片免费看 | 亚洲涩涩色 | 欧美性生活大片 | 国产精品剧情在线亚洲 | 国产免费高清 | 六月婷色 | 人人射人人爽 | 国产精品爽爽久久久久久蜜臀 | 婷婷色网址 | 99精品在线免费 | 日韩高清不卡一区二区三区 | 久久精品99国产 | 美女视频久久 | av福利在线导航 | 国产亚洲欧美在线视频 | 亚洲国产人午在线一二区 | 欧美激情第十页 | 亚洲欧洲一区二区在线观看 | 久久久资源网 | 亚州天堂 | 国产一区二区三区四区在线 | 国产一区私人高清影院 | 欧美激情综合五月色丁香小说 | 97成人啪啪网 | 日韩成人免费在线 | 国产不卡在线观看视频 | 美女网站在线看 | 99re亚洲国产精品 | 超碰av在线播放 | 精品一区在线 | 国产高清永久免费 | 国产在线观看av | 色网av | 五月婷在线视频 | 精品极品在线 | 国产精品 国内视频 | 亚洲视频综合在线 | 日日夜夜精品视频天天综合网 | 久久国产一区 | 一区二区亚洲精品 | av官网在线 | 免费在线观看av电影 | 国产自在线观看 | 成人在线视频网 | 欧美精品网站 | 91在线视频免费观看 | 在线观看不卡视频 | 国产裸体无遮挡 | 久久午夜鲁丝片 | 久久99国产精品二区护士 | 久久久性| 天天看天天干 | 欧亚日韩精品一区二区在线 | 黄色成人在线观看 | 久久精品毛片 | 麻花传媒mv免费观看 | 在线观看免费国产小视频 | 夜夜操天天操 | 日韩欧美国产激情在线播放 | 免费色网站 | 久久香蕉国产精品麻豆粉嫩av | 91视频亚洲 | 玖玖视频在线 | 激情欧美一区二区三区免费看 | 五月天网站在线 | 欧美aa在线 | 国产群p视频 | 日韩xxxxxxxxx| 久久97久久 | 亚洲特级毛片 | 91丨九色丨国产在线 | 久精品视频在线观看 | 亚洲成人免费在线观看 | 中文字幕免费高清在线观看 | 天天干天天爽 | 一区二区精品国产 | 精品uu | 国产1区2区3区在线 亚洲自拍偷拍色图 | 精品国产一区在线观看 | 在线免费av电影 | 国产精品成人在线观看 | 欧美精品久久久久久久亚洲调教 | 国产精品视频久久 | 精品国产不卡 | 国产在线一区二区 | 天天摸天天操天天爽 | 视频一区二区三区视频 | 国产亚洲精品精品精品 | japanesexxxxfreehd乱熟 | 一级成人网 | 精品99免费视频 | 成年人电影毛片 | 国产一级免费在线观看 | 色婷婷综合久久久久中文字幕1 | 免费h精品视频在线播放 | 日本在线观看一区二区三区 | 欧美成人精品欧美一级乱 | 免费视频99 | 色5月婷婷| 麻豆国产电影 | 91麻豆文化传媒在线观看 | 亚洲有 在线| 韩国在线视频一区 | 中文字幕免费一区 | 精品久久1| 中文字幕在线观看国产 | 激情文学综合丁香 | 亚洲欧洲国产视频 | 9999在线视频 | 亚洲视频久久久 | av在线免费观看不卡 | 国产亚洲精品久久久久久无几年桃 | 久热国产视频 | 国产成人福利片 | 五月激情天 | 成人午夜影院在线观看 | 亚洲人成影院在线 | 欧美日韩在线观看一区 | 日韩精品高清不卡 | 四虎成人精品永久免费av | 久草在线综合 | 天天操网站| 久久久污 | 亚洲自拍偷拍色图 | 亚洲人av免费网站 | 国产福利免费看 | 天天插综合网 | 国产精品美女999 | 伊人婷婷色 | 婷婷在线网站 | aaa日本高清在线播放免费观看 | 黄色综合| 成年人网站免费在线观看 | 国内精品久久久久久久久久久久 | 色综合夜色一区 | 欧美日韩国产亚洲乱码字幕 | 人九九精品 | 欧美日韩免费一区二区三区 | 超碰在线9 | 天天天天天操 | 日韩在线视频线视频免费网站 | 国产精品99久久99久久久二8 | 亚洲欧洲久久久 | 黄av资源 | 国产精品福利小视频 | 亚洲精品视频在 | 午夜视频在线网站 | 香蕉视频网站在线观看 | 97成人资源 | 亚洲黄色免费在线看 | 亚洲国产剧情 | 亚洲精品国内 | 超碰在线天天 | 在线色亚洲 | 久久人操 | 久久视频在线观看中文字幕 | 亚洲有 在线 | 伊人激情网 | 久艹在线免费观看 | 亚洲欧美偷拍另类 | 国产a级免费 | 亚洲一区二区精品视频 | 日本久久精 | 久久第四色 | 国产精品国产三级国产aⅴ入口 | 亚洲免费永久精品国产 | 亚洲精品免费在线 | 国产一级高清 | 麻豆系列在线观看 | 深夜视频久久 | 中文字幕在线播放一区二区 | 久久精品久久精品 | 91久久影院| 久在线观看视频 | 国产日韩欧美在线观看视频 | 在线观看91精品国产网站 | 在线视频免费观看 | 亚洲欧美精品一区二区 | 激情在线网址 | 久久视频网 | 久草精品免费 | 91最新中文字幕 | 蜜臀精品久久久久久蜜臀 | 亚洲精品在线视频 | 成人手机在线视频 | 福利av影院| 在线视频 影院 | 精品久久一区二区三区 | 日韩毛片精品 | 国内成人精品视频 | 999久久久欧美日韩黑人 | 粉嫩高清一区二区三区 | 91av视频观看 | 麻豆视频在线免费观看 | 中文字幕在线观看免费高清电影 | 欧美孕妇与黑人孕交 | 亚洲电影第一页av | 亚洲欧美日韩精品久久奇米一区 | 久久影院一区 | 最新极品jizzhd欧美 | 91视频中文字幕 | 久久国产亚洲视频 | 国产原创中文在线 | 91在线免费公开视频 | 亚洲五月六月 | 国产午夜精品在线 | 精品一区二区在线看 | 欧美日韩一区二区免费在线观看 | 97视频免费在线观看 | 成人黄在线观看 | 人人插人人搞 | 成人av电影免费在线播放 | 肉色欧美久久久久久久免费看 | 国产最新视频在线观看 | www操操| 97视频总站 | 久久久久国产精品免费网站 | 午夜狠狠干| 久久久www免费电影网 | 91中文字幕网 | 丁香色综合 | 丁香资源影视免费观看 | 国产精品av免费在线观看 | 国产精品免费久久久久久 | 免费看v片| 亚洲综合婷婷 | 亚洲一区 av | 国产精品一区二区 91 | 4p变态网欧美系列 | 2019国产精品 | 久久99久久99精品免观看软件 | 中文区中文字幕免费看 | 欧美色噜噜噜 | 国内精品久久久久久久影视麻豆 | 91中文字幕一区 | 最新国产一区二区三区 | 精品久久久久久国产91 | 色狠狠综合 | 亚洲永久精品在线观看 | 狠狠色免费 | 久久av福利 | 热九九精品 | 午夜精品久久久久久久爽 | 婷婷黄色片| 91亚洲精品国偷拍 | 在线观看国产高清视频 | 五月激情久久久 | 天天艹天天干天天 | 国产精品资源 | 成人黄色大片在线观看 | 狠狠狠色丁香综合久久天下网 | 91福利视频免费 | 亚洲闷骚少妇在线观看网站 | 日韩两性视频 | 国产日韩欧美在线影视 | 免费色视频在线 | 伊人伊成久久人综合网站 | 久久1区 |