BLI: add safe_powf function

The same function is also used by cycles.
This commit is contained in:
Jacques Lucke 2020-07-16 10:46:18 +02:00
parent 4a9d903e2b
commit 35bfe1702c
3 changed files with 20 additions and 0 deletions

View File

@ -103,6 +103,7 @@ MINLINE float pow2f(float x);
MINLINE float pow3f(float x);
MINLINE float pow4f(float x);
MINLINE float pow7f(float x);
MINLINE float safe_powf(float base, float exponent);
MINLINE float sqrt3f(float f);
MINLINE double sqrt3d(double d);

View File

@ -70,6 +70,13 @@ MINLINE float pow7f(float x)
{
return pow2f(pow3f(x)) * x;
}
MINLINE float safe_powf(float base, float exponent)
{
if (UNLIKELY(base < 0.0f && exponent != (int)exponent)) {
return 0.0f;
}
return powf(base, exponent);
}
MINLINE float sqrt3f(float f)
{

View File

@ -113,3 +113,15 @@ TEST(math_base, Log2CeilU)
EXPECT_EQ(log2_ceil_u(9), 4);
EXPECT_EQ(log2_ceil_u(123456), 17);
}
TEST(math_base, SafePowf)
{
EXPECT_FLOAT_EQ(safe_powf(4.0f, 3.0f), 64.0f);
EXPECT_FLOAT_EQ(safe_powf(3.2f, 5.6f), 674.2793796f);
EXPECT_FLOAT_EQ(safe_powf(4.0f, -2.0f), 0.0625f);
EXPECT_FLOAT_EQ(safe_powf(6.0f, -3.2f), 0.003235311f);
EXPECT_FLOAT_EQ(safe_powf(-4.0f, 6), 4096.0f);
EXPECT_FLOAT_EQ(safe_powf(-3.0f, 5.5), 0.0f);
EXPECT_FLOAT_EQ(safe_powf(-2.5f, -4.0f), 0.0256f);
EXPECT_FLOAT_EQ(safe_powf(-3.7f, -4.5f), 0.0f);
}