Commit 979d9027 authored by Brian Kessler's avatar Brian Kessler Committed by Keith Randall

math/bits: define Div to panic when y<=hi

Div panics when y<=hi because either the quotient overflows
the size of the output or division by zero occurs when y==0.
This provides a uniform behavior for all implementations.

Fixes #28316

Change-Id: If23aeb10e0709ee1a60b7d614afc9103d674a980
Reviewed-on: https://go-review.googlesource.com/c/149517Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 319787a5
...@@ -454,8 +454,7 @@ func Mul64(x, y uint64) (hi, lo uint64) { ...@@ -454,8 +454,7 @@ func Mul64(x, y uint64) (hi, lo uint64) {
// Div returns the quotient and remainder of (hi, lo) divided by y: // Div returns the quotient and remainder of (hi, lo) divided by y:
// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper
// half in parameter hi and the lower half in parameter lo. // half in parameter hi and the lower half in parameter lo.
// hi must be < y otherwise the behavior is undefined (the quotient // Div panics for y == 0 (division by zero) or y <= hi (quotient overflow).
// won't fit into quo).
func Div(hi, lo, y uint) (quo, rem uint) { func Div(hi, lo, y uint) (quo, rem uint) {
if UintSize == 32 { if UintSize == 32 {
q, r := Div32(uint32(hi), uint32(lo), uint32(y)) q, r := Div32(uint32(hi), uint32(lo), uint32(y))
...@@ -468,8 +467,7 @@ func Div(hi, lo, y uint) (quo, rem uint) { ...@@ -468,8 +467,7 @@ func Div(hi, lo, y uint) (quo, rem uint) {
// Div32 returns the quotient and remainder of (hi, lo) divided by y: // Div32 returns the quotient and remainder of (hi, lo) divided by y:
// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper
// half in parameter hi and the lower half in parameter lo. // half in parameter hi and the lower half in parameter lo.
// hi must be < y otherwise the behavior is undefined (the quotient // Div32 panics for y == 0 (division by zero) or y <= hi (quotient overflow).
// won't fit into quo).
func Div32(hi, lo, y uint32) (quo, rem uint32) { func Div32(hi, lo, y uint32) (quo, rem uint32) {
if y != 0 && y <= hi { if y != 0 && y <= hi {
panic(overflowError) panic(overflowError)
...@@ -482,8 +480,7 @@ func Div32(hi, lo, y uint32) (quo, rem uint32) { ...@@ -482,8 +480,7 @@ func Div32(hi, lo, y uint32) (quo, rem uint32) {
// Div64 returns the quotient and remainder of (hi, lo) divided by y: // Div64 returns the quotient and remainder of (hi, lo) divided by y:
// quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper // quo = (hi, lo)/y, rem = (hi, lo)%y with the dividend bits' upper
// half in parameter hi and the lower half in parameter lo. // half in parameter hi and the lower half in parameter lo.
// hi must be < y otherwise the behavior is undefined (the quotient // Div64 panics for y == 0 (division by zero) or y <= hi (quotient overflow).
// won't fit into quo).
func Div64(hi, lo, y uint64) (quo, rem uint64) { func Div64(hi, lo, y uint64) (quo, rem uint64) {
const ( const (
two32 = 1 << 32 two32 = 1 << 32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment