$30 off During Our Annual Pro Sale. View Details »

Ecmascript BigInt

Ecmascript BigInt

Ecmascript で導入されそうなBigInt型についてです。

More Decks by Taketoshi Aono(青野健利 a.k.a brn)

Other Decks in Programming

Transcript

  1. Ecmascript BigInt

    View Slide

  2. せ⵸: @brn (ꫬꅿ⨳ⵃa.k.a ـٕ٦ظ)
    耵噟: ؿٗٝزؒٝسؒٝآص،٥iOSؒٝآص،
    ⠓爡: Cyberagent ،سذؙأةآؔRightSegment٥AI Messenger
    ـؚٗ: http://abcdef.gets.b6n.ch/
    Twitter: https://twitter.com/brn227
    GitHub: https://github.com/brn

    View Slide

  3. Integer or Number…
    JavascriptךNumber㘗כ⦓侧䏝㼭侧挿㘗կ
    ׉׃גծ׉ך剑㣐⦼כ53Bitⴓ2 ^ 53 – 1կ
    ׁ׵חؽحز怴皾׾遤ֲ㜥さכ32Bit侭侧ח㢌䳔ׁ׸׷׋׭ծ
    2 ^ 32הז׷կ

    View Slide

  4. Double Precision
    Floating Point
    ⦓礵䏝嵤⹛㼭侧挿侧(DPFP)כ㼰侧׾12345 ה 10 ^ xחⴓֽג罋ִ׷
    邌植倯岀կ
    DPFPכIEEE 754ח״׏ג⟃♴ך״ֲח㹀纏ׁ׸גְ׷կ
    52
    11
    1
    ˟⽃⡘כׅץגؽحز
    䊩ַ׵ծ痗〾ؽحز٥䭷侧鿇٥⟎侧鿇הְֲせ⵸חז׏גְ׷կ

    View Slide

  5. Double
    Precision
    Floating
    Point
    A. 痗〾ؽحزהכ1bit׾⢪׏ג⦼ָ
    +ַ-׾邌植ׅ׷կ
    B. 䭷侧鿇הכ11ؽحز׾⢪׏ג10ך⛦
    皾׾邌植ׅ׷կ
    C. ⟎侧鿇כ53ؽحزך侭侧⦼׾邌植
    ׅ׷կ

    ׅ׷ה⟃♴ך״ֲח㼰侧׾邌植ׅ׷ֿ
    הָדֹ׷կ
    (A? +1 : -1) * (C * (10 ^ B))

    View Slide

  6. MAX_SAFE_INTEGER
    Ecmascriptחכֿך⦓礵䏝嵤⹛㼭侧挿侧ך眔㔲ד㸜Ⰻח鎘皾דֹ׷
    ⦼ךMax⦼׾㹀׭גֶ׶ծ
    Number.MAX_SAFE_INTEGERה׃ג،ؙإأׅ׷ֿהָ〳腉կ
    ׉׃ג׉ך⦼כ⵸鶢ך(2 ^ 53 – 1)הז׷կ
    ז׈ז׵IEEE 754ךDPFPדכ⟎侧鿇ָ52ؽحز׃ַזְַ׵կ

    View Slide

  7. Limitation
    ׃ַ׃ծMAX_SAFE_INTEGER׾馄ִ׷侧⦼ד怴皾׾׃׋ְ㜥さכ
    וֲׅ׷ךַ
    npmٌآُ٦ٕ׾⢪ֲ
    •  substack/node-bitint
    •  peterolson/BigInteger.js

    View Slide

  8. var bigint = require('bigint');!
    !
    var b =
    bigint('782910138827292261791972728324982')!
    .sub('182373273283402171237474774728373')!
    .div(8);!
    !
    console.log(b);!

    View Slide

  9. Operator Problem
    铣׫חְֻ…
    ׉׮׉׮JSכぐ珏怴皾㶨׾ؔ٦غ٦ٗ٦سדֹזְךדծ
    杝荈侧⦼ؙٓأחכַז׶搀椚ָ֮׷կ

    View Slide

  10. Ecmascript BigInt
    ׉ֿדtc39 proposalחEcmascript BigIntָ䲿周ׁ׸׋կ
    植㖈stage3זךד׮ֲ㼰׃ד䱰欽׏גٓ؎ٝկ

    View Slide

  11. BigInt
    Overview
    BigIntכSignedהUnsignedך64bit侭
    侧⦼ד邌植ׁ׸׷կ
    侧⦼ٔذٕٓך䖓׹חn ׾אֽ׷ֿה
    דBigIntٔذٕٓ׾邌植ׅ׷կ
    HexװOctalٔذٕٓ׮؟ه٦زկ侧⦼
    ٔذٕٓהずֻׄn׾劣㽵חאֽ׷ֿ
    הדBigIntחז׷կ(׋׌׃ծOctalכ
    0oXXX䕎䒭ך׫)
    ת׋ծtypeof כ 'bigint'ָ䨱׷կ

    View Slide

  12. function nthPrime(nth) {!
    function isPrime(p) {!
    for (let i = 2n; i < p; i++) {!
    if (p % i === 0n) return false;!
    }!
    return true;!
    }!
    for (let i = 2n; ; i++) {!
    if (isPrime(i)) {!
    if (--nth === 0n) return i;!
    }!
    }!
    }!

    View Slide

  13. BigInt
    Operators
    怴皾㶨כغ؎شٔؔلٖ٦ة٦
    + - * ** / % הծ
    ぐ珏ؽحز怴皾| & << >> ^ הծ
    嫰鯰怴皾㶨 == === < > >= <=
    ׾؟ه٦زկ
    ׋׌׃ծ0㙵׭怴皾㶨 >>> כ؟ه٦
    ز׃זְկ

    View Slide

  14. BigInt Objects
    Number㘗ך״ֲחٓحػ٦ؔـآؙؑزךBigIntؔـآؙؑز׮欽
    䠐ׁ׸׷կ
    䔲搫Constructor׮欽䠐ׁ׸׷կ
    ConstructorכNumberך״ֲח俑㶵⴨װ׉ך➭ך㘗׾BigIntח㢌䳔
    ׅ׷կ

    View Slide

  15. new BigInt('34034')!
    // BigInt {[[PrimitiveValue]]: 34034n}!
    // new でオブジェクトを生成
    !
    BigInt('34034')!
    // 34034n!
    // 関数呼び出しで変換
    !
    BigInt.asUintN(width, BigInt)!
    // 引数BigIntを 0 から 2 ^ widthのサイズのBigIntに変
    換する。
    !
    BigInt.asIntN(width, BigInt)!
    // 引数BigIntを -2 ^ width から 2 ^ (width - 1) -
    1のサイズのBitInt型に変換する。
    !
    BigInt.parseInt(string[, radix])!
    // 文字列をradixを基数とするBigInt型に変換する。

    View Slide

  16. BigInt
    Limitation
    Number㘗הך幉さכ鏩〳ׁ׸זְկ
    את׶ծぐ珏怴皾㶨כBigIntず㡦ד׃
    ַ㹋遤דֹזְկ
    JSךDPFPהך怴皾ך穠卓ָIntegerח
    ז׵זְךדBigIntך⥂鏾㢩חז׏ג
    ׃תֲկ
    את׶农럀ך㢌䳔כ♧ⴖ遤׻׸זְկ
    ׋׌׃ծ嫰鯰怴皾ך׫幉さׅ׷ֿהָ
    鏩〳ׁ׸גְ׷կ

    View Slide

  17. TypedArray
    ׁ׵חTypedArrayח׮ BigInt64ArrayהBigUint64Array㘗ָ鷄⸇ׁ
    ׸׷կ
    ׉׸׊׸Int64הUint64㘗ד侧⦼׾⥂䭯ׅ׷կ

    View Slide

  18. DataView
    DataViewח׮
    get/set BigInt64
    ًاحسָ鷄⸇ׁ׸גծ⦼׾BitInt㘗ה׃ג《׶⳿ׇ׷״ֲחז׷կ

    View Slide

  19. תה׭
    װ׏הjavascriptח׮64bit侭侧ֹתׅיկ
    ׀幠耮֮׶ָהֲ׀ְׂת׃׋

    View Slide