Данная функция возвращает целое значение натурального логарифма при введенном 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;
}