libs/libc/math: Fix calculation error of log function
Fix a problem where the log function would loop infinitely by calculation error when a specific value was passed. For example, in the following case, the log function loops infinitely and never returns. So, this commit fixes to return the right value. double a = 7883961.5; double b = log(a);
This commit is contained in:
parent
5fe51b923a
commit
2e80d5e38e
@ -60,7 +60,7 @@ double log(double x)
|
|||||||
{
|
{
|
||||||
double y;
|
double y;
|
||||||
double y_old;
|
double y_old;
|
||||||
double ney;
|
double ey;
|
||||||
double epsilon;
|
double epsilon;
|
||||||
int relax_factor;
|
int relax_factor;
|
||||||
int iter;
|
int iter;
|
||||||
@ -75,8 +75,8 @@ double log(double x)
|
|||||||
while (y > y_old + epsilon || y < y_old - epsilon)
|
while (y > y_old + epsilon || y < y_old - epsilon)
|
||||||
{
|
{
|
||||||
y_old = y;
|
y_old = y;
|
||||||
ney = exp(-y);
|
ey = exp(y);
|
||||||
y -= 1.0 - x * ney;
|
y -= (ey - x) / ey;
|
||||||
|
|
||||||
if (y > 700.0)
|
if (y > 700.0)
|
||||||
{
|
{
|
||||||
|
@ -58,7 +58,7 @@ float logf(float x)
|
|||||||
{
|
{
|
||||||
float y;
|
float y;
|
||||||
float y_old;
|
float y_old;
|
||||||
float ney;
|
float ey;
|
||||||
float epsilon;
|
float epsilon;
|
||||||
int relax_factor;
|
int relax_factor;
|
||||||
int iter;
|
int iter;
|
||||||
@ -73,8 +73,8 @@ float logf(float x)
|
|||||||
while (y > y_old + epsilon || y < y_old - epsilon)
|
while (y > y_old + epsilon || y < y_old - epsilon)
|
||||||
{
|
{
|
||||||
y_old = y;
|
y_old = y;
|
||||||
ney = expf(-y);
|
ey = expf(y);
|
||||||
y -= 1.0F - x * ney;
|
y -= (ey - x) / ey;
|
||||||
|
|
||||||
if (y > FLT_MAX_EXP_X)
|
if (y > FLT_MAX_EXP_X)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user