Index: tests/MathTest.cpp |
diff --git a/tests/MathTest.cpp b/tests/MathTest.cpp |
index 772bade1856cbe8b70bbc32eb8125419047372c9..3c2bc644073ddcd211e732c645a28fd894a4b00d 100644 |
--- a/tests/MathTest.cpp |
+++ b/tests/MathTest.cpp |
@@ -382,6 +382,40 @@ static void unittest_half(skiatest::Reporter* reporter) { |
} |
+static void test_rsqrt(skiatest::Reporter* reporter) { |
+ const float maxRelativeError = 6.50196699e-4f; |
+ |
+ // test close to 0 up to 1 |
+ float input = 0.000001f; |
+ for (int i = 0; i < 1000; ++i) { |
+ float exact = 1.0f/sk_float_sqrt(input); |
+ float estimate = sk_float_rsqrt(input); |
+ float relativeError = sk_float_abs(exact - estimate)/exact; |
+ REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
+ input += 0.001f; |
+ } |
+ |
+ // test 1 to ~100 |
+ input = 1.0f; |
+ for (int i = 0; i < 1000; ++i) { |
+ float exact = 1.0f/sk_float_sqrt(input); |
+ float estimate = sk_float_rsqrt(input); |
+ float relativeError = sk_float_abs(exact - estimate)/exact; |
+ REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
+ input += 0.01f; |
+ } |
+ |
+ // test some big numbers |
+ input = 1000000.0f; |
+ for (int i = 0; i < 100; ++i) { |
+ float exact = 1.0f/sk_float_sqrt(input); |
+ float estimate = sk_float_rsqrt(input); |
+ float relativeError = sk_float_abs(exact - estimate)/exact; |
+ REPORTER_ASSERT(reporter, relativeError <= maxRelativeError); |
+ input += 754326.f; |
+ } |
+} |
+ |
static void test_muldiv255(skiatest::Reporter* reporter) { |
for (int a = 0; a <= 255; a++) { |
for (int b = 0; b <= 255; b++) { |
@@ -521,6 +555,7 @@ DEF_TEST(Math, reporter) { |
unittest_fastfloat(reporter); |
unittest_isfinite(reporter); |
unittest_half(reporter); |
+ test_rsqrt(reporter); |
for (i = 0; i < 10000; i++) { |
SkFixed numer = rand.nextS(); |