Index: test/unittests/base/ieee754-unittest.cc |
diff --git a/test/unittests/base/ieee754-unittest.cc b/test/unittests/base/ieee754-unittest.cc |
index e74698a5a731a94f39341da9f270968f56e284bb..c0a1887b5519a00c9e42f80b486e32817aaa60fe 100644 |
--- a/test/unittests/base/ieee754-unittest.cc |
+++ b/test/unittests/base/ieee754-unittest.cc |
@@ -16,6 +16,13 @@ namespace v8 { |
namespace base { |
namespace ieee754 { |
+namespace { |
+ |
+double const kPI = 3.141592653589793; |
+double const kTwo120 = 1.329227995784916e+36; |
+ |
+} // namespace |
+ |
TEST(Ieee754, Atan) { |
EXPECT_THAT(atan(std::numeric_limits<double>::quiet_NaN()), IsNaN()); |
EXPECT_THAT(atan(std::numeric_limits<double>::signaling_NaN()), IsNaN()); |
@@ -97,12 +104,16 @@ TEST(Ieee754, Cos) { |
// Test that cos(Math.PI/2) != 0 since Math.PI is not exact. |
EXPECT_EQ(6.123233995736766e-17, cos(1.5707963267948966)); |
// Test cos for various phases. |
- EXPECT_EQ(0.7071067811865474, cos(7.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(0.7071067811865477, cos(9.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(-0.7071067811865467, cos(11.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(-0.7071067811865471, cos(13.0 / 4 * 3.141592653589793)); |
+ EXPECT_EQ(0.7071067811865474, cos(7.0 / 4 * kPI)); |
+ EXPECT_EQ(0.7071067811865477, cos(9.0 / 4 * kPI)); |
+ EXPECT_EQ(-0.7071067811865467, cos(11.0 / 4 * kPI)); |
+ EXPECT_EQ(-0.7071067811865471, cos(13.0 / 4 * kPI)); |
EXPECT_EQ(0.9367521275331447, cos(1000000.0)); |
- EXPECT_EQ(-3.435757038074824e-12, cos(1048575.0 / 2 * 3.141592653589793)); |
+ EXPECT_EQ(-3.435757038074824e-12, cos(1048575.0 / 2 * kPI)); |
+ |
+ // Test Hayne-Panek reduction. |
+ EXPECT_EQ(-0.9258790228548379e0, cos(kTwo120)); |
+ EXPECT_EQ(-0.9258790228548379e0, cos(-kTwo120)); |
} |
TEST(Ieee754, Exp) { |
@@ -244,17 +255,58 @@ TEST(Ieee754, Sin) { |
// Tests for sin. |
EXPECT_EQ(0.479425538604203, sin(0.5)); |
EXPECT_EQ(-0.479425538604203, sin(-0.5)); |
- EXPECT_EQ(1, sin(1.5707963267948966)); |
- EXPECT_EQ(-1, sin(-1.5707963267948966)); |
+ EXPECT_EQ(1, sin(kPI / 2.0)); |
+ EXPECT_EQ(-1, sin(-kPI / 2.0)); |
// Test that sin(Math.PI) != 0 since Math.PI is not exact. |
- EXPECT_EQ(1.2246467991473532e-16, sin(3.141592653589793)); |
- EXPECT_EQ(-7.047032979958965e-14, sin(2200 * 3.141592653589793)); |
+ EXPECT_EQ(1.2246467991473532e-16, sin(kPI)); |
+ EXPECT_EQ(-7.047032979958965e-14, sin(2200.0 * kPI)); |
// Test sin for various phases. |
- EXPECT_EQ(-0.7071067811865477, sin(7.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(0.7071067811865474, sin(9.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(0.7071067811865483, sin(11.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(-0.7071067811865479, sin(13.0 / 4 * 3.141592653589793)); |
- EXPECT_EQ(-3.2103381051568376e-11, sin(1048576.0 / 4 * 3.141592653589793)); |
+ EXPECT_EQ(-0.7071067811865477, sin(7.0 / 4.0 * kPI)); |
+ EXPECT_EQ(0.7071067811865474, sin(9.0 / 4.0 * kPI)); |
+ EXPECT_EQ(0.7071067811865483, sin(11.0 / 4.0 * kPI)); |
+ EXPECT_EQ(-0.7071067811865479, sin(13.0 / 4.0 * kPI)); |
+ EXPECT_EQ(-3.2103381051568376e-11, sin(1048576.0 / 4 * kPI)); |
+ |
+ // Test Hayne-Panek reduction. |
+ EXPECT_EQ(0.377820109360752e0, sin(kTwo120)); |
+ EXPECT_EQ(-0.377820109360752e0, sin(-kTwo120)); |
+} |
+ |
+TEST(Ieee754, Tan) { |
+ // Test values mentioned in the EcmaScript spec. |
+ EXPECT_THAT(tan(std::numeric_limits<double>::quiet_NaN()), IsNaN()); |
+ EXPECT_THAT(tan(std::numeric_limits<double>::signaling_NaN()), IsNaN()); |
+ EXPECT_THAT(tan(std::numeric_limits<double>::infinity()), IsNaN()); |
+ EXPECT_THAT(tan(-std::numeric_limits<double>::infinity()), IsNaN()); |
+ |
+ // Tests for tan for |x| < pi/4 |
+ EXPECT_EQ(std::numeric_limits<double>::infinity(), 1 / tan(0.0)); |
+ EXPECT_EQ(-std::numeric_limits<double>::infinity(), 1 / tan(-0.0)); |
+ // tan(x) = x for |x| < 2^-28 |
+ EXPECT_EQ(2.3283064365386963e-10, tan(2.3283064365386963e-10)); |
+ EXPECT_EQ(-2.3283064365386963e-10, tan(-2.3283064365386963e-10)); |
+ // Test KERNELTAN for |x| > 0.67434. |
+ EXPECT_EQ(0.8211418015898941, tan(11.0 / 16.0)); |
+ EXPECT_EQ(-0.8211418015898941, tan(-11.0 / 16.0)); |
+ EXPECT_EQ(0.41421356237309503, tan(0.39269908169872414)); |
+ // crbug/427468 |
+ EXPECT_EQ(0.7993357819992383, tan(0.6743358)); |
+ |
+ // Tests for tan. |
+ EXPECT_EQ(3.725290298461914e-9, tan(3.725290298461914e-9)); |
+ // Test that tan(PI/2) != Infinity since PI is not exact. |
+ EXPECT_EQ(1.633123935319537e16, tan(kPI / 2)); |
+ // Cover different code paths in KERNELTAN (tangent and cotangent) |
+ EXPECT_EQ(0.5463024898437905, tan(0.5)); |
+ EXPECT_EQ(2.0000000000000027, tan(1.107148717794091)); |
+ EXPECT_EQ(-1.0000000000000004, tan(7.0 / 4.0 * kPI)); |
+ EXPECT_EQ(0.9999999999999994, tan(9.0 / 4.0 * kPI)); |
+ EXPECT_EQ(-6.420676210313675e-11, tan(1048576.0 / 2.0 * kPI)); |
+ EXPECT_EQ(2.910566692924059e11, tan(1048575.0 / 2.0 * kPI)); |
+ |
+ // Test Hayne-Panek reduction. |
+ EXPECT_EQ(-0.40806638884180424e0, tan(kTwo120)); |
+ EXPECT_EQ(0.40806638884180424e0, tan(-kTwo120)); |
} |
} // namespace ieee754 |