ProgIng - Programación en Ingeniería
Loading...
Searching...
No Matches
Ejemplo012.c File Reference

Aproximación de ln(x) con serie tipo atanh calculando potencias desde cero. More...

#include <stdio.h>
Include dependency graph for Ejemplo012.c:

Go to the source code of this file.

Functions

int main (int argc, char *argv[])

Detailed Description

Aproximación de ln(x) con serie tipo atanh calculando potencias desde cero.

Para x > 0 se usa la identidad: ln(x) = 2 * [ f + f^3/3 + f^5/5 + ... ] donde: f = (x - 1) / (x + 1)

Entonces: ln(x) ≈ 2 * sum_{i=0}^{n-1} f^{2i+1} / (2i+1)

Este programa:

  • Lee n (número de términos) y x (valor real positivo).
  • Calcula f = (x-1)/(x+1).
  • Para cada término i calcula explícitamente f^{2i+1} multiplicando f varias veces.
Entrada
  • Un entero n >= 1 (número de términos).
  • Un real x > 0.
Salida
Imprime la aproximación:
ln(x) = valor
Precondiciones
  • x debe ser positivo (ln(x) solo está definida para x > 0 en los reales).
Complejidad
Tiempo: O(n^2) (por el doble ciclo al calcular potencias). Memoria: O(1).
Note
La convergencia es mejor cuando x está cerca de 1 (porque |f| es pequeño).

Definition in file Ejemplo012.c.

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

Definition at line 41 of file Ejemplo012.c.

42{
43 (void)argc;
44 (void)argv;
45
46 int n, i, j;
47 int den; /* denominador impar: 1,3,5,... */
48 float x; /* valor para evaluar ln(x) */
49 float lnx; /* acumulador de la serie */
50 float fct; /* f = (x-1)/(x+1) */
51 float num; /* potencia: f^{den} */
52
53 /* Leer n >= 1 */
54 do {
55 printf("Ingres el numero de terminos: ");
56 scanf("%d", &n);
57 } while (n < 1);
58
59 /* Leer x > 0 */
60 do {
61 printf("Ingrese el valor de x: ");
62 scanf("%f", &x);
63 } while (x <= 0);
64
65 /*
66 f = (x - 1) / (x + 1)
67 y la serie es:
68 ln(x) = 2 * sum_{i=0}^{n-1} f^{2i+1}/(2i+1)
69 */
70 for (i = 0, fct = (x - 1) / (x + 1), lnx = 0; i < n; i++)
71 {
72 den = 2*i + 1; /* 1, 3, 5, ... */
73
74 /*
75 Calcular num = fct^den multiplicando fct den veces:
76 num = fct * fct * ... * fct (den factores)
77 */
78 for (j = 0, num = 1; j < den; j++)
79 num *= fct;
80
81 /* Sumar el término: f^{den}/den */
82 lnx += num / den;
83 }
84
85 /* Multiplicar por 2 según la identidad */
86 lnx *= 2;
87
88 printf("ln(%f) = %f\n", x, lnx);
89 return 0;
90}
double fct(double x, int n)
Definition Ejemplo029.c:34
Here is the call graph for this function: