GithubHelp home page GithubHelp logo

euclid-divmod's Introduction

Euclidean division and remainder

Bart Massey

Note: Turns out that as of Rust 1.38 Rust includes div_euclid() and rem_euclid() in std for signed integer types. Their implementation is a little different (and a little simpler) than mine, but has more branches: I'll have to benchmark at some point to see which is faster. In any case, I would highly recommend not using my crate. I'll leave it up for historical interest.

Background

Many programming languages define integer division to either "truncate" / "round toward zero" (C, Rust) or "round down" (Python). In either case, the integer remainder will sometimes have to be negative to get the identity

(a // b) * b + a % b = a

to hold. (This is an identity necessary for arithmetic to make reasonable sense).

In the Nickle programming language we chose a different convention used by languages such as Pascal, Maple and the Z3 Theorem prover: "Euclidean" division and remainder. In this system, the remainder is always non-negative, and integer division is adjusted to make the identity hold. The definition of integer division becomes

a // b = sgn(b) * floor(a / abs(b))

See Wikipedia for a thorough explanation: in particular a citation to Raymond Boute's paper The Euclidean definition of the functions div and mod, which is definitely worth a read.

Unfortunately, Euclidean division and remainder is awkward to implement directly in Rust in terms of its "normal" % and / operators. This crate provides a slow but (believed to be) correct implementation.

License

This program is licensed under the "MIT License". Please see the file LICENSE in this distribution for license terms.

euclid-divmod's People

Contributors

bartmassey avatar

Stargazers

GAURAV avatar

Watchers

 avatar James Cloos avatar  avatar

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.