From 9ce38f570f1c62662c1ce04a3fbe62817708ac45 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 13 Dec 2018 13:55:15 -0800 Subject: [PATCH] math: don't run huge argument tests on s390x The s390x implementations for Sin/Cos/SinCos/Tan use assembly routines which don't reduce arguments accurately enough for huge inputs. Fixes #29221. Change-Id: I340f576899d67bb52a553c3ab22e6464172c936d Reviewed-on: https://go-review.googlesource.com/c/154119 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/math/all_test.go | 84 ------------------------------------ src/math/huge_test.go | 99 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 84 deletions(-) create mode 100644 src/math/huge_test.go diff --git a/src/math/all_test.go b/src/math/all_test.go index 5716048454..c2d2efcd97 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -176,47 +176,6 @@ var cosLarge = []float64{ -7.3924135157173099849e-01, } -// Inputs to test trig_reduce -var trigHuge = []float64{ - 1 << 120, - 1 << 240, - 1 << 480, - 1234567891234567 << 180, - 1234567891234567 << 300, - MaxFloat64, -} - -// Results for trigHuge[i] calculated with https://github.com/robpike/ivy -// using 4096 bits of working precision. Values requiring less than -// 102 decimal digits (1 << 120, 1 << 240, 1 << 480, 1234567891234567 << 180) -// were confirmed via https://keisan.casio.com/ -var cosHuge = []float64{ - -0.92587902285483787, - 0.93601042593353793, - -0.28282777640193788, - -0.14616431394103619, - -0.79456058210671406, - -0.99998768942655994, -} - -var sinHuge = []float64{ - 0.37782010936075202, - -0.35197227524865778, - 0.95917070894368716, - 0.98926032637023618, - -0.60718488235646949, - 0.00496195478918406, -} - -var tanHuge = []float64{ - -0.40806638884180424, - -0.37603456702698076, - -3.39135965054779932, - -6.76813854009065030, - 0.76417695016604922, - -0.00496201587444489, -} - var cosh = []float64{ 7.2668796942212842775517446e+01, 1.1479413465659254502011135e+03, @@ -3103,49 +3062,6 @@ func TestTrigReduce(t *testing.T) { } } -// Check that trig values of huge angles return accurate results. -// This confirms that argument reduction works for very large values -// up to MaxFloat64. -func TestHugeCos(t *testing.T) { - for i := 0; i < len(trigHuge); i++ { - f1 := cosHuge[i] - f2 := Cos(trigHuge[i]) - if !close(f1, f2) { - t.Errorf("Cos(%g) = %g, want %g", trigHuge[i], f2, f1) - } - } -} - -func TestHugeSin(t *testing.T) { - for i := 0; i < len(trigHuge); i++ { - f1 := sinHuge[i] - f2 := Sin(trigHuge[i]) - if !close(f1, f2) { - t.Errorf("Sin(%g) = %g, want %g", trigHuge[i], f2, f1) - } - } -} - -func TestHugeSinCos(t *testing.T) { - for i := 0; i < len(trigHuge); i++ { - f1, g1 := sinHuge[i], cosHuge[i] - f2, g2 := Sincos(trigHuge[i]) - if !close(f1, f2) || !close(g1, g2) { - t.Errorf("Sincos(%g) = %g, %g, want %g, %g", trigHuge[i], f2, g2, f1, g1) - } - } -} - -func TestHugeTan(t *testing.T) { - for i := 0; i < len(trigHuge); i++ { - f1 := tanHuge[i] - f2 := Tan(trigHuge[i]) - if !close(f1, f2) { - t.Errorf("Tan(%g) = %g, want %g", trigHuge[i], f2, f1) - } - } -} - // Check that math constants are accepted by compiler // and have right value (assumes strconv.ParseFloat works). // https://golang.org/issue/201 diff --git a/src/math/huge_test.go b/src/math/huge_test.go new file mode 100644 index 0000000000..0b45dbf5b1 --- /dev/null +++ b/src/math/huge_test.go @@ -0,0 +1,99 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Disabled for s390x because it uses assembly routines that are not +// accurate for huge arguments. + +// +build !s390x + +package math_test + +import ( + . "math" + "testing" +) + +// Inputs to test trig_reduce +var trigHuge = []float64{ + 1 << 120, + 1 << 240, + 1 << 480, + 1234567891234567 << 180, + 1234567891234567 << 300, + MaxFloat64, +} + +// Results for trigHuge[i] calculated with https://github.com/robpike/ivy +// using 4096 bits of working precision. Values requiring less than +// 102 decimal digits (1 << 120, 1 << 240, 1 << 480, 1234567891234567 << 180) +// were confirmed via https://keisan.casio.com/ +var cosHuge = []float64{ + -0.92587902285483787, + 0.93601042593353793, + -0.28282777640193788, + -0.14616431394103619, + -0.79456058210671406, + -0.99998768942655994, +} + +var sinHuge = []float64{ + 0.37782010936075202, + -0.35197227524865778, + 0.95917070894368716, + 0.98926032637023618, + -0.60718488235646949, + 0.00496195478918406, +} + +var tanHuge = []float64{ + -0.40806638884180424, + -0.37603456702698076, + -3.39135965054779932, + -6.76813854009065030, + 0.76417695016604922, + -0.00496201587444489, +} + +// Check that trig values of huge angles return accurate results. +// This confirms that argument reduction works for very large values +// up to MaxFloat64. +func TestHugeCos(t *testing.T) { + for i := 0; i < len(trigHuge); i++ { + f1 := cosHuge[i] + f2 := Cos(trigHuge[i]) + if !close(f1, f2) { + t.Errorf("Cos(%g) = %g, want %g", trigHuge[i], f2, f1) + } + } +} + +func TestHugeSin(t *testing.T) { + for i := 0; i < len(trigHuge); i++ { + f1 := sinHuge[i] + f2 := Sin(trigHuge[i]) + if !close(f1, f2) { + t.Errorf("Sin(%g) = %g, want %g", trigHuge[i], f2, f1) + } + } +} + +func TestHugeSinCos(t *testing.T) { + for i := 0; i < len(trigHuge); i++ { + f1, g1 := sinHuge[i], cosHuge[i] + f2, g2 := Sincos(trigHuge[i]) + if !close(f1, f2) || !close(g1, g2) { + t.Errorf("Sincos(%g) = %g, %g, want %g, %g", trigHuge[i], f2, g2, f1, g1) + } + } +} + +func TestHugeTan(t *testing.T) { + for i := 0; i < len(trigHuge); i++ { + f1 := tanHuge[i] + f2 := Tan(trigHuge[i]) + if !close(f1, f2) { + t.Errorf("Tan(%g) = %g, want %g", trigHuge[i], f2, f1) + } + } +} -- 2.48.1