Files
test2/intern/cycles/test/util_math_fast_test.cpp
Aras Pranckevicius 35d7477371 Cycles: fix accuracy issues in fast_sin/fast_cos/fast_sincos
Most of these originate from OIIO of about 10 years ago. Integrate
the upstream fix from OIIO:
https://github.com/AcademySoftwareFoundation/OpenImageIO/commit/88feb65fc992

Cover them with unit tests. Before the fix, fast_sinf(1.57085085f)
was returning 0.0 instead of 1.0 as expected.

Revert previous hair workaround (a16879a5f0)

Co-authored-by: Sergey Sharybin <sergey@blender.org>
Pull Request: https://projects.blender.org/blender/blender/pulls/131957
2024-12-16 10:05:47 +01:00

57 lines
1.7 KiB
C++

/* SPDX-FileCopyrightText: 2024 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "testing/testing.h"
#include "util/math.h"
#include "util/math_fast.h"
CCL_NAMESPACE_BEGIN
TEST(math, fast_sinf)
{
/* Test values in -2PI .. 2PI range. */
constexpr int N = 1000 + 1;
for (int i = 0; i < N; ++i) {
const float delta = 4 * M_PI_F / (N - 1);
const float phi = -2 * M_PI_F + i * delta;
EXPECT_NEAR(fast_sinf(phi), sinf(phi), 1.9e-7f);
}
/* Test exact PI/2 values. */
EXPECT_NEAR(fast_sinf(M_PI_2_F), 1.0f, 1e-9f);
EXPECT_NEAR(fast_sinf(-M_PI_2_F), -1.0f, 1e-9f);
/* Test these close to PI/2 values. */
EXPECT_NEAR(fast_sinf(1.57085085f), 0.9999999985f, 1e-9f);
EXPECT_NEAR(fast_sinf(-1.57085085f), -0.9999999985f, 1e-9f);
/* Test large values; fast_sinf expected to do good range reduction. */
EXPECT_NEAR(fast_sinf(15378.3f), -0.2025494905f, 2e-4f);
EXPECT_NEAR(fast_sinf(-78431.5f), 0.9976474762f, 2e-4f);
}
TEST(math, fast_cosf)
{
/* Test values in -2PI .. 2PI range. */
constexpr int N = 1000 + 1;
for (int i = 0; i < N; ++i) {
const float delta = 4 * M_PI_F / (N - 1);
const float phi = -2 * M_PI_F + i * delta;
EXPECT_NEAR(fast_cosf(phi), cosf(phi), 4.5e-7f);
}
/* Test exact PI/2 values. */
EXPECT_NEAR(fast_cosf(M_PI_2_F), 0.0f, 3e-7f);
EXPECT_NEAR(fast_cosf(-M_PI_2_F), 0.0f, 3e-7f);
/* Test these close to PI/2 values. */
EXPECT_NEAR(fast_cosf(1.57085085f), -0.00005452320508f, 3e-7f);
EXPECT_NEAR(fast_cosf(-1.57085085f), -0.00005452320508f, 3e-7f);
/* Test large values; fast_cosf expected to do good range reduction. */
EXPECT_NEAR(fast_cosf(15378.3f), -0.9792720275f, 2e-4f);
EXPECT_NEAR(fast_cosf(-78431.5f), 0.06855299586f, 2e-4f);
}
CCL_NAMESPACE_END