Implementando de manera rápida lo que comentó @diskontrol que como he podido comprobar solo es válido para logaritmos en base 10, he sacado este código (seguro que es un churro, no me mateis
). En cuanto lo último comentado por @Puntoinfinito eso solo vale para logaritmos exactos. ¿@do-while al fin y al cabo es ensayo y error no? Si yo tengo log
24 -> 2
x = 4 vas probando valores enteros hasta que tengas un resultado mayor que 4 o igual y vas reduciendo ... no sé tampoco tengo nivel matemático para hacerlo, implemente la serie de Taylor pero es muy lenta, dejo el código al que @diskontrol se refería:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#define PRECISION 1000
#define e 2.7182818284590452353602874713526624977572470936999595749669676277240766303535
double ln (double num);
double log10 (double num, std::string &str);
double pow (double base, register int exp);
int main(int argc , char * argv [])
{
string str;
cout <<"Resultado en la precision maxima de de double es: "<< log10(34.4,str) << endl;
cout << "Resultado truncado a "<< PRECISION << " decimales es: " << endl<< str;
return 0;
}
double pow (double base, register int exp)
{
double ret = 1;
while(exp!=0)
{
ret = base*ret;
--exp;
}
return ret;
}
double ln (double num)
{
string unused;
return (log10(num,unused)/log10(e,unused));
}
double log10 (double num,std::string &str)
{
double ret = 0;
double decimal = 0;
if(num < 10)
num = pow(num,10);
else
{
while(num >= 10)
{
num /= 10;
++ret;
}
num = pow(num,10);
}
ostringstream convert; // stream usado para la conversión.
convert <<ret;
str += convert.str();
str += '.';
for(register int i = 1 ; i != PRECISION; ++i)
{
while(num >= 10)
{
num /= 10;
++decimal;
}
ret += decimal*(1/(pow(10,i)));
num = pow(num,10);
str +=(char) decimal+48;
decimal = 0;
}
return ret;
}