Skip to content

Commit 02b1e89

Browse files
pkarashchenkoxiaoxiang781216
authored andcommitted
libs/libm/libm: apply epsilon relax factor only if epsilon is small
Signed-off-by: Petro Karashchenko <[email protected]>
1 parent 9cfb100 commit 02b1e89

File tree

2 files changed

+12
-22
lines changed

2 files changed

+12
-22
lines changed

libs/libm/libm/lib_log.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ double log(double x)
6464
double y_old;
6565
double ey;
6666
double epsilon;
67-
double relax_factor;
67+
double rf; /* epsilon relax factor */
6868
int iter;
6969

7070
y = 0.0;
7171
y_old = 1.0;
7272
epsilon = DBL_EPSILON;
7373

74-
iter = 0;
75-
relax_factor = 1.0;
74+
iter = 0;
75+
rf = 1.0;
7676

7777
while (y > y_old + epsilon || y < y_old - epsilon)
7878
{
@@ -90,18 +90,13 @@ double log(double x)
9090
y = -DBL_MAX_EXP_X;
9191
}
9292

93-
epsilon = (fabs(y) > 1.0) ? fabs(y) * DBL_EPSILON : DBL_EPSILON;
93+
epsilon = ((fabs(y) > rf) ? fabs(y) : rf) * DBL_EPSILON;
9494

9595
if (++iter >= LOG_MAX_ITER)
9696
{
97-
relax_factor *= LOG_RELAX_MULTIPLIER;
97+
rf *= LOG_RELAX_MULTIPLIER;
9898
iter = 0;
9999
}
100-
101-
if (relax_factor > 1.0)
102-
{
103-
epsilon *= relax_factor;
104-
}
105100
}
106101

107102
if (y == DBL_MAX_EXP_X)

libs/libm/libm/lib_logf.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ float logf(float x)
6060
float y_old;
6161
float ey;
6262
float epsilon;
63-
float relax_factor;
63+
float rf; /* epsilon relax factor */
6464
int iter;
6565

66-
y = 0.0F;
67-
y_old = 1.0F;
66+
y = 0.0F;
67+
y_old = 1.0F;
6868
epsilon = FLT_EPSILON;
6969

70-
iter = 0;
71-
relax_factor = 1.0F;
70+
iter = 0;
71+
rf = 1.0F;
7272

7373
while (y > y_old + epsilon || y < y_old - epsilon)
7474
{
@@ -86,18 +86,13 @@ float logf(float x)
8686
y = -FLT_MAX_EXP_X;
8787
}
8888

89-
epsilon = (fabsf(y) > 1.0F) ? fabsf(y) * FLT_EPSILON : FLT_EPSILON;
89+
epsilon = ((fabsf(y) > rf) ? fabsf(y) : rf) * FLT_EPSILON;
9090

9191
if (++iter >= LOGF_MAX_ITER)
9292
{
93-
relax_factor *= LOGF_RELAX_MULTIPLIER;
93+
rf *= LOGF_RELAX_MULTIPLIER;
9494
iter = 0;
9595
}
96-
97-
if (relax_factor > 1.0F)
98-
{
99-
epsilon *= relax_factor;
100-
}
10196
}
10297

10398
if (y == FLT_MAX_EXP_X)

0 commit comments

Comments
 (0)