| // 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. |
| |
| //go:build !s390x |
| |
| package math_test |
| |
| import ( |
| . "math" |
| "testing" |
| ) |
| |
| // Inputs to test trig_reduce |
| var trigHuge = []float64{ |
| 1 << 28, |
| 1 << 29, |
| 1 << 30, |
| 1 << 35, |
| 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.16556897949057876, |
| -0.94517382606089662, |
| 0.78670712294118812, |
| -0.76466301249635305, |
| -0.92587902285483787, |
| 0.93601042593353793, |
| -0.28282777640193788, |
| -0.14616431394103619, |
| -0.79456058210671406, |
| -0.99998768942655994, |
| } |
| |
| var sinHuge = []float64{ |
| -0.98619821183697566, |
| 0.32656766301856334, |
| -0.61732641504604217, |
| -0.64443035102329113, |
| 0.37782010936075202, |
| -0.35197227524865778, |
| 0.95917070894368716, |
| 0.98926032637023618, |
| -0.60718488235646949, |
| 0.00496195478918406, |
| } |
| |
| var tanHuge = []float64{ |
| 5.95641897939639421, |
| -0.34551069233430392, |
| -0.78469661331920043, |
| 0.84276385870875983, |
| -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) |
| } |
| } |
| } |