Giter Club home page Giter Club logo

Comments (11)

Fil avatar Fil commented on May 17, 2024 1

from d3-array.

Fil avatar Fil commented on May 17, 2024

for reference https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift

from d3-array.

Fil avatar Fil commented on May 17, 2024

Fun! Does this manifest in practice? The largest array I've been able to generate has 2,145,386,496 Uint8 elements, and it seems that d3 bisects it correctly.

from d3-array.

yurivish avatar yurivish commented on May 17, 2024

In Safari the following code freezes the tab, which I think is compatible with the idea described here.

image

a = new Uint8Array(2147483649)

d3.bisectRight(a, 0)

https://github.com/d3/d3-array/blob/main/src/bisector.js#L34-L44

The comparison will always be zero, so lo will be incremented, even though mid is no longer in [lo, hi).

from d3-array.

yurivish avatar yurivish commented on May 17, 2024

Confirmed with Safari's debugger – after a few iterations, e is the left endpoint, i is the (exclusive) right endpoint, and r is the midpoint (zero!)

image

from d3-array.

Fil avatar Fil commented on May 17, 2024

from d3-array.

yurivish avatar yurivish commented on May 17, 2024

All good questions.

It looks like this isn't a common issue right now, but given the direction things are heading I wouldn't be surprised if Chrome lifts the limit at some point in the next few years. Binary search has a rich history of bugs like this, which weren't discovered until many years later when data sizes increased. :)

I took a quick look and d3 uses the x >>> 1 idiom in other places, some of which would probably want a similar update.

FWIW I noticed this while experimenting with techniques for interactively zooming and panning ~billion-point datasets on the client side, which is a fairly niche use case right now.

from d3-array.

yurivish avatar yurivish commented on May 17, 2024

Actually, I think we could just use

const mid = lo + (hi - lo) >>> 1;

as a strict improvement, which will work correctly for a larger range of values.

I was also reminded today of the existence of Math.trunc, which would work for this case and is said to be faster than Math.floor, though I haven't benchmarked it:

const mid = lo + Math.trunc((hi - lo) / 2);

from d3-array.

mbostock avatar mbostock commented on May 17, 2024

Is there any reason not to use the simpler form?

const mid = Math.trunc((lo + hi) / 2);

I mean sure, you could run out of integer precision when adding lo + hi, but that should only happen if the combined index is greater than or equal to 2^53 (9,007,199,254,740,992). Which at a minimum would represent 9 petabytes of memory. And if d3-array is being used on a supercomputer of that size… well, they’d probably find other problems lol.

from d3-array.

yurivish avatar yurivish commented on May 17, 2024

That's a good point. I don't see any issues with the simpler form.

Which at a minimum would represent 9 petabytes of memory. And if d3-array is being used on a supercomputer of that size… well, they’d probably find other problems lol.

😄

from d3-array.

mbostock avatar mbostock commented on May 17, 2024

Related https://lemire.me/blog/2022/12/06/fast-midpoint-between-two-integers-without-overflow/

from d3-array.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.