Данная функция возвращает целое значение натурального логарифма при введенном x. Как сделать так, чтобы функция возвращала также и остаток?

double ln(double x)
{
    const double e = 2.7182818284;
    double exponent = 0;
    if (x < 0) x = -x;
    while (x > e)
    {
        x /= e;
        exponent++;
    }

    return exponent;

}

cmath использовать нельзя.


Ответы (1 шт):

Автор решения: AlexGlebe

Вы использовали формулы логарифма Log[x] = Log[x/e] + 1. Можно дальше использовать формулу степенную Log[x^2] = Log[x] * 2. Нужно только задать аргумент точности.

static double lnn ( double x , int n ) {
  if ( n < 1 )
    return x - 1 ;
  const double e = 2.7182818284;
  double res =  0 ;
  while ( x >= e ) {
    res += 1 ;
    x /= e ; }
  return res + lnn ( x * x , n - 1 ) / 2 ;
}

double ln ( double x , int n = 18 ) {
  if ( x == 1 )
    return 0 ;
  if ( x < 1 )
    return - lnn ( 1 / x , n );
  // <= 0 => неопределёнка
  return lnn ( x , n );
}

# include <iostream>
int main(){
  std::cout<<"ln [ 1000 ] = "<<ln(1000)<<std::endl;
}
→ Ссылка