| 2123 | |
| 2124 | template <typename TYPE> |
| 2125 | void CheckApproxEquals() { |
| 2126 | std::shared_ptr<Array> a, b; |
| 2127 | std::shared_ptr<DataType> type = TypeTraits<TYPE>::type_singleton(); |
| 2128 | |
| 2129 | ArrayFromVector<TYPE>(type, {true, false}, {0.5, 1.0}, &a); |
| 2130 | ArrayFromVector<TYPE>(type, {true, false}, {0.5000001f, 2.0}, &b); |
| 2131 | ASSERT_TRUE(a->ApproxEquals(b)); |
| 2132 | ASSERT_TRUE(b->ApproxEquals(a)); |
| 2133 | for (bool nans_equal : {false, true}) { |
| 2134 | for (bool signed_zeros_equal : {false, true}) { |
| 2135 | auto opts = |
| 2136 | EqualOptions().nans_equal(nans_equal).signed_zeros_equal(signed_zeros_equal); |
| 2137 | ASSERT_TRUE(a->ApproxEquals(b, opts)); |
| 2138 | ASSERT_TRUE(b->ApproxEquals(a, opts)); |
| 2139 | } |
| 2140 | } |
| 2141 | |
| 2142 | // Default tolerance too small |
| 2143 | ArrayFromVector<TYPE>(type, {true, false}, {0.5001f, 2.0}, &b); |
| 2144 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2145 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2146 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-3))); |
| 2147 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-3))); |
| 2148 | for (bool nans_equal : {false, true}) { |
| 2149 | for (bool signed_zeros_equal : {false, true}) { |
| 2150 | auto opts = |
| 2151 | EqualOptions().nans_equal(nans_equal).signed_zeros_equal(signed_zeros_equal); |
| 2152 | ASSERT_FALSE(a->ApproxEquals(b, opts)); |
| 2153 | ASSERT_FALSE(b->ApproxEquals(a, opts)); |
| 2154 | ASSERT_TRUE(a->ApproxEquals(b, opts.atol(1e-3))); |
| 2155 | ASSERT_TRUE(b->ApproxEquals(a, opts.atol(1e-3))); |
| 2156 | } |
| 2157 | } |
| 2158 | |
| 2159 | // Values on other sides of 0 |
| 2160 | ArrayFromVector<TYPE>(type, {true, false}, {-0.0001f, 1.0}, &a); |
| 2161 | ArrayFromVector<TYPE>(type, {true, false}, {0.0001f, 2.0}, &b); |
| 2162 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2163 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2164 | ASSERT_TRUE(a->ApproxEquals(b, EqualOptions().atol(1e-3))); |
| 2165 | ASSERT_TRUE(b->ApproxEquals(a, EqualOptions().atol(1e-3))); |
| 2166 | for (bool nans_equal : {false, true}) { |
| 2167 | for (bool signed_zeros_equal : {false, true}) { |
| 2168 | auto opts = |
| 2169 | EqualOptions().nans_equal(nans_equal).signed_zeros_equal(signed_zeros_equal); |
| 2170 | ASSERT_FALSE(a->ApproxEquals(b, opts)); |
| 2171 | ASSERT_FALSE(b->ApproxEquals(a, opts)); |
| 2172 | ASSERT_TRUE(a->ApproxEquals(b, opts.atol(1e-3))); |
| 2173 | ASSERT_TRUE(b->ApproxEquals(a, opts.atol(1e-3))); |
| 2174 | } |
| 2175 | } |
| 2176 | |
| 2177 | // Mismatching validity |
| 2178 | ArrayFromVector<TYPE>(type, {true, false}, {0.5, 1.0}, &a); |
| 2179 | ArrayFromVector<TYPE>(type, {false, false}, {0.5, 1.0}, &b); |
| 2180 | ASSERT_FALSE(a->ApproxEquals(b)); |
| 2181 | ASSERT_FALSE(b->ApproxEquals(a)); |
| 2182 | ASSERT_FALSE(a->ApproxEquals(b, EqualOptions().nans_equal(true))); |
nothing calls this directly
no test coverage detected