#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
// compilar com
// gcc aproxLog.c -o aproxLog -lm
// pra executar no linux:
// ./aproxLog
#define E 2.71828182845904509080
#define radix(x, y) pow(x, 1.0/y)
typedef struct NumeroLog
{
int *array;
int qtInteiros; // quantidade
double base;
double myLog;
} NumeroLog;
int initNumeroLog(NumeroLog *numero, double b)
{
numero->base = b;
numero->array = malloc( sizeof(int) );
numero->array[0]=0;
numero->qtInteiros = 1;
return 1;
}
void farFreeArray(NumeroLog *numero)
{
if(numero->qtInteiros!=0)
{
free(numero->array);
}
}
void calcLog(NumeroLog *numero, int limite)
{
while(limite>0)
{
if(numero->myLog >= numero->base)
{
numero->myLog = numero->myLog/numero->base;
numero->array = realloc(numero->array, (numero->qtInteiros+1)*sizeof(int) );
numero->array[numero->qtInteiros]=numero->array[numero->qtInteiros-1];
numero->qtInteiros++;
}
else
{
numero->myLog *= numero->myLog;
if(numero->array[numero->qtInteiros-1]==0) numero->array[numero->qtInteiros-1]=1;
else numero->array[numero->qtInteiros-1]++;
}
limite--;
}
}
int imprime(NumeroLog *numero)
{
double resp=0;
for(int i=0; i<numero->qtInteiros-1; i++)
{
resp+=1.0/pow(2, numero->array[i]);
printf(" + (1/pow(2,%i))", numero->array[i]);
}
printf(" + log(%.16lf)/pow(2,%i) \n", numero->myLog, numero->array[numero->qtInteiros-1]);
resp+= log(numero->myLog) / pow(2, numero->array[numero->qtInteiros-1]) ;
printf("resp = %.16lf\n" , resp);
}
int main()
{
// metodo
// log(A*B) = log(A) + log(B)
// log(A/B) = log(A) - log(B)
// log(A^B) = B*log(A)
// alguns numeros primos
int primes[10]={2,3,5,7,11,13,17,19,23,29};
int tm = sizeof(primes)/sizeof(primes[0]);
for(int i=0; i<tm; i++)
{
printf(" ======================================\n");
printf("log(%i) = \n", primes[i]);
NumeroLog temp;
temp.myLog=primes[i];
initNumeroLog(&temp, E);
calcLog(&temp, 18);
imprime(&temp);
farFreeArray(&temp);
}
return 0;
}
Nenhum comentário:
Postar um comentário