domingo, 26 de setembro de 2021

Linguagem C: Método para realizar aproximações de um logaritmo

 #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: