From 97a17842e53b4fd4168ae51ab91b367baefbd888 Mon Sep 17 00:00:00 2001 From: Seth Bunce Date: Wed, 28 Sep 2022 07:52:54 -0700 Subject: [PATCH] remove float32 variant, relocate into separate file This change removes the float32 variant of the AlmostEqual funcs, that we will likely never use. This change also relocates the function into a separate file to avoid modifying a file that's a fork of another vendored package. --- prometheus/internal/almost_equal.go | 40 +++++++++++++ prometheus/internal/difflib.go | 92 ----------------------------- 2 files changed, 40 insertions(+), 92 deletions(-) create mode 100644 prometheus/internal/almost_equal.go diff --git a/prometheus/internal/almost_equal.go b/prometheus/internal/almost_equal.go new file mode 100644 index 000000000..53392d009 --- /dev/null +++ b/prometheus/internal/almost_equal.go @@ -0,0 +1,40 @@ +package internal + +import ( + "math" +) + +// minNormalFloat64 is the smallest positive normal value of type float64. +var minNormalFloat64 = math.Float64frombits(0x0010000000000000) + +// AlmostEqualFloat64 returns true if a and b are equal within a relative error +// of epsilon. See http://floating-point-gui.de/errors/comparison/ for the +// details of the applied method. +// +// This function is copy/paste to avoid a dependency. +// https://github.com/beorn7/floats +func AlmostEqualFloat64(a, b, epsilon float64) bool { + if a == b { + return true + } + absA := math.Abs(a) + absB := math.Abs(b) + diff := math.Abs(a - b) + if a == 0 || b == 0 || absA+absB < minNormalFloat64 { + return diff < epsilon*minNormalFloat64 + } + return diff/math.Min(absA+absB, math.MaxFloat64) < epsilon +} + +// AlmostEqualFloat64s is the slice form of AlmostEqualFloat64. +func AlmostEqualFloat64s(a, b []float64, epsilon float64) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if !AlmostEqualFloat64(a[i], b[i], epsilon) { + return false + } + } + return true +} diff --git a/prometheus/internal/difflib.go b/prometheus/internal/difflib.go index 1ab88fe52..fd45cadc0 100644 --- a/prometheus/internal/difflib.go +++ b/prometheus/internal/difflib.go @@ -22,7 +22,6 @@ import ( "bytes" "fmt" "io" - "math" "strings" ) @@ -47,97 +46,6 @@ func calculateRatio(matches, length int) float64 { return 1.0 } -var ( - // minNormalFloat64 is the smallest positive normal value of type float64. - minNormalFloat64 = math.Float64frombits(0x0010000000000000) - - // minNormalFloat32 is the smallest positive normal value of type float32. - minNormalFloat32 = math.Float32frombits(0x00800000) -) - -// AlmostEqualFloat64 returns true if a and b are equal within a relative error -// of epsilon. See http://floating-point-gui.de/errors/comparison/ for the -// details of the applied method. -// -// This function is copy/paste to avoid a dependency. -// https://github.com/beorn7/floats -func AlmostEqualFloat64(a, b, epsilon float64) bool { - if a == b { - return true - } - absA := math.Abs(a) - absB := math.Abs(b) - diff := math.Abs(a - b) - if a == 0 || b == 0 || absA+absB < minNormalFloat64 { - return diff < epsilon*minNormalFloat64 - } - return diff/math.Min(absA+absB, math.MaxFloat64) < epsilon -} - -// AlmostEqualFloat64s is the slice form of AlmostEqualFloat64. -func AlmostEqualFloat64s(a, b []float64, epsilon float64) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if !AlmostEqualFloat64(a[i], b[i], epsilon) { - return false - } - } - return true -} - -// AlmostEqualFloat32 returns true if a and b are equal within a relative error -// of epsilon. See http://floating-point-gui.de/errors/comparison/ for the -// details of the applied method. -// -// This function is copy/paste to avoid a dependency. -// https://github.com/beorn7/floats -func AlmostEqualFloat32(a, b, epsilon float32) bool { - if a == b { - return true - } - absA := AbsFloat32(a) - absB := AbsFloat32(b) - diff := AbsFloat32(a - b) - if a == 0 || b == 0 || absA+absB < minNormalFloat32 { - return diff < epsilon*minNormalFloat32 - } - return diff/MinFloat32(absA+absB, math.MaxFloat32) < epsilon -} - -// AlmostEqualFloat32s is the slice form of AlmostEqualFloat32. -func AlmostEqualFloat32s(a, b []float32, epsilon float32) bool { - if len(a) != len(b) { - return false - } - for i := range a { - if !AlmostEqualFloat32(a[i], b[i], epsilon) { - return false - } - } - return true -} - -// AbsFloat32 works like math.Abs, but for float32. -func AbsFloat32(x float32) float32 { - switch { - case x < 0: - return -x - case x == 0: - return 0 // return correctly abs(-0) - } - return x -} - -// MinFloat32 works like math.Min, but for float32. -func MinFloat32(x, y float32) float32 { - if x < y { - return x - } - return y -} - type Match struct { A int B int