elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con el siguiente programa.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con el siguiente programa.  (Leído 3,120 veces)
padiuwu

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Ayuda con el siguiente programa.
« en: 9 Agosto 2018, 19:45 pm »

Haga un programa donde dado como dato un ángulo en grados, los convierta a
radianes y calcule e imprima todas las funciones trigonométricas de ese ángulo.
*Coma calcular sin la libreria math.h

Código:
#include <iostream>
#include<math.h>

using namespace std;

#define PI 3.1416
void conversion ();
void funcionesTrigometricas();
float radianes;

int main()
{
    conversion();
    funcionesTrigometricas();
    return 0;
}

void conversion (){
    float grados;
    cout << "Ingrese el numero de grados: ";
    cin >> grados;

    radianes = grados*(PI/180);

    cout << grados << " Grados equivale a " << radianes << " radianes\n";
}
void funcionesTrigometricas(){
    float seno, coseno, tangente, secante, cotangente, cosecante;
    seno = sin(radianes);
    coseno = cos(radianes);
    tangente = tan(radianes);
    secante = 1/cos(radianes);
    cotangente = 1/tan(radianes);
    cosecante = 1/sin(radianes);

    cout << "\nSeno = " << seno;
    cout << "\nCoseno = " << coseno;
    cout << "\nTangente = " << tangente;
    cout << "\nSecante = " << secante;
    cout << "\nCotangente = "<< cotangente;
    cout << "\nCosecante = " << cosecante;
}


« Última modificación: 10 Agosto 2018, 03:17 am por padiuwu » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda con el siguiente programa.
« Respuesta #1 en: 9 Agosto 2018, 20:08 pm »

Ahora la pregunta.


En línea

padiuwu

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Re: Ayuda con el siguiente programa.
« Respuesta #2 en: 10 Agosto 2018, 02:20 am »

Tengo mi prgrama a media en este caso este ya transforma los que es los angulos a radianes, pero no se como calcular lo demas, necesito un ejemplo, tengo algunas formulas pero no se si sean las correctas.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con el siguiente programa.
« Respuesta #3 en: 10 Agosto 2018, 02:25 am »

lamentablemente con eso no dices nada...

muestra tu codigo e indica donde tienes la duda exactamente y de forma detallada
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Computo de funciones trigonométricas
« Respuesta #4 en: 31 Agosto 2018, 15:23 pm »

Como dices, tu solución carece de "valor" en tanto que utilizas la librería <math.h>, que resuelve el problema que se te pide.

El cálculo de funciones trigonométricas se puede abordar desde muchos puntos de vista (calculo numérico, teoremas de trigonometría), pero todos ellos serán imprecisos en sus resultados en la medida que el sistema de tipos de C, (float) esta limitado en su capacidad para representar, no digamos ya cualquier número real, si no muchos números racionales, por ejemplo (1/3).

El clásico método para aproximar la función seno ( el resto, coseno y tangente, investigalos por tu cuenta) se basa en el Teorema de Taylor que permite el cómputo del valor de sen en términos de operraciones elementales, productos, sumas, potencias y divisiones:

Código:
 sinus(x) = sum i : 0<= i : (((-1)^i)/(2i+1)!)*x^(2i+1)

Como no es posible extenderme puesto que no es un curso de análisis numérico, baste decir que en toda implementación hay que tener en cuenta la precisión con la que abordamos el problema, en nuestro caso, hasta las diezmilésimas (10^-4)

Allá va el código. La línea central, la más compleja de elaborar, es la 28. Expplicar de donde se saca es un poco complejo sin entrar en manipulaciones algebraicas. Baste decir que t es el sumando correspondeinte al valor n. Lo que hace 28 es actualizar t para la siguiente vuelta, y esto se puede hacer en función del valor que tiene actualmente t.

Código
  1. #include <iostream>
  2. #include <iomanip> // To format floats into screen
  3.  
  4. /* Uses Taylor formula to compute sin(x), x in gradiants
  5.    
  6.    sinus(x) = sum i : 0<= i : (((-1)^i)/(2i+1)!)*x^(2i+1)
  7.  
  8.    Any computer program makes a finite computation, hence
  9.    we only add summands up to epsilon (in our case, 10^-4)
  10.  
  11.  */
  12.  
  13. #define PI 3.1416
  14. #define G2R(g) (g*PI/180)
  15. #define EPSILON 0.0001
  16. #define ABS(x) ((x>=0)?x:-x)
  17.  
  18. using namespace std;
  19.  
  20. /* P: r given in radians */
  21. float sinus(const float r)
  22. {
  23.  int n;
  24.  float s,t;
  25.  for(n=s=0,t=r; ABS(t) >= EPSILON ; n++)
  26.    {
  27.      s+=t;
  28.      t = ((-1)*r*r*t)/((2*n+3.0)*(2*n+2.0));
  29.    }
  30.  return s;
  31. }
  32.  
  33.  
  34. int main(int argc, char *args[])
  35. {
  36.  float g;
  37.  for ( ; cin >> g ; )
  38.    {
  39.      const float r = G2R(g);
  40.      std::cout << std::fixed << std::setw( 11 ) << std::setprecision(4)
  41. << g << " " <<  r << " " << sinus(r) << endl;
  42.    }
  43.  
  44. }

Y a continuación, la salida a algunos casos de angulos conocidos, como son  aquellos de seno 0,1,-1 y 0.5.
La primera columna marca el ánglo en grados, la segunda en radianes (aproximado) y la tercera la función seno del mismo....Se aprecia como en el caso de 360 grados cuyo seno es 0, arroja una aproximaci'on de 0,0001

Código:
0 90 180 270 360 
     0.0000 0.0000 0.0000
    90.0000 1.5708 1.0000
   180.0000 3.1416 0.0000
   270.0000 4.7124 -1.0000
   360.0000 6.2832 0.0001
30 150 210 330
    30.0000 0.5236 0.5000
   150.0000 2.6180 0.5000
   210.0000 3.6652 -0.5000
   330.0000 5.7596 -0.5000
1200
  1200.0000 20.9440 5.4417

El último caso es llamativo, pues da un error incoherente...El seno sólo puede ser entre -1 y 1. Nuevamente, se debe a la imprecisión para representar numeros grandes, y ciertamente, si te fijas en el producto del código de la línea 28, esta incluye un valor "relativamente grande", que float es incapaz de representar. Ojo a los errores en el cálculo numérico!
« Última modificación: 31 Agosto 2018, 15:37 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ayuda con el siguiente programa.
« Respuesta #5 en: 31 Agosto 2018, 21:37 pm »

Podria evitarse el overflow al convertir el angulo gigante en el pequeno equivalente, por ejemplo

Código
  1. float G2R(float g) {
  2.    while(g > 360) {
  3.        g -= 360;
  4.    }
  5.    return g*PI/180;
  6. }

2 mejoras a esto:
- En vez de iterar restando 360, dividir por 360, y luego restar directamente la cantidad de veces que cabe 360 en el numero gigante.
- Algo similar hay que hacer para angulos negativos gigantes
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Ayuda con el siguiente programa.
« Respuesta #6 en: 3 Septiembre 2018, 15:08 pm »

Podria evitarse el overflow al convertir el angulo gigante en el pequeno equivalente, por ejemplo

Código
  1. float G2R(float g) {
  2.    while(g > 360) {
  3.        g -= 360;
  4.    }
  5.    return g*PI/180;
  6. }

2 mejoras a esto:
- En vez de iterar restando 360, dividir por 360, y luego restar directamente la cantidad de veces que cabe 360 en el numero gigante.
- Algo similar hay que hacer para angulos negativos gigantes

Solo puedo decir una cosa : GENIAL.

No creo que sea un defecto por el posible overflow, (de hecho me parece que no hay overflow, como dije antes...) El algoritmo mismo exige 0 <= r <= 2pi

Propongo, para simplificar tantos positivos como negativos grandes, la macro

Código
  1. #define G2R(g) ((g%360)*PI/180)
  2.  

Aunque el operador (%) solo admite int, y ni podamos meter "floats".

Código
  1. int g;
  2.  for ( ; cin >> g ; )
  3.  

Ahora, tnemeos
Código:
0 90 180 270 360
          0 0.0000 0.0000
         90 1.5708 1.0000
        180 3.1416 0.0000
        270 4.7124 -1.0000
        360 0.0000 0.0000
0 -90 -180 -270 -360
          0 0.0000 0.0000
        -90 -1.5708 -1.0000
       -180 -3.1416 -0.0000
       -270 -4.7124 1.0000
       -360 0.0000 0.0000
0 1170 1260 1350 1440  # I.e  [0,90,180,270,360] + 360x3
          0 0.0000 0.0000
       1170 1.5708 1.0000
       1260 3.1416 0.0000
       1350 4.7124 -1.0000
       1440 0.0000 0.0000
0 -1170 -1260 -1350 -1440
          0 0.0000 0.0000
      -1170 -1.5708 -1.0000
      -1260 -3.1416 -0.0000
      -1350 -4.7124 1.0000
      -1440 0.0000 0.0000

Como Dios manda.... ;-)
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Computo de funciones trigonométricas
« Respuesta #7 en: 3 Septiembre 2018, 15:48 pm »

El clásico método para aproximar la función seno ( el resto, coseno y tangente, investigalos por tu cuenta) se basa en el Teorema de Taylor que permite el cómputo del valor de sen en términos de operraciones elementales, productos, sumas, potencias y divisiones:
El algoritmo eficaz para todo esto es el algoritmo CORDIC.... que lo resuelve con sumas restas y desplazamiento de bits...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
funciones trigonometricas
Programación Visual Basic
Gokuman 2 2,612 Último mensaje 22 Abril 2008, 18:53 pm
por Gokuman
Razones trigonometricas(C++) « 1 2 »
Programación C/C++
Danyel_Casvill 12 14,178 Último mensaje 12 Junio 2011, 22:37 pm
por Danyel_Casvill
Ayuda con Matematicas ( Limite de Identidades Trigonometricas)
Dudas Generales
lpnu 8 9,734 Último mensaje 20 Octubre 2011, 06:44 am
por xdeadpoolx
Duda razones trigonométricas C++
Programación C/C++
Bob1098 2 2,106 Último mensaje 7 Abril 2014, 19:56 pm
por noele1995
Calculando funciones trigonométricas sin librerías (series de taylor) (Aporte)
Programación C/C++
engel lex 1 8,255 Último mensaje 1 Noviembre 2015, 05:41 am
por furciorifa
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines