funcion en c++ que calcule valor de un numero decimal redondeado a n num decimal

Iniciado por juanjoxdlol, 29 Marzo 2018, 23:20 PM

0 Miembros y 1 Visitante están viendo este tema.

juanjoxdlol

tengo que escribir una función redondear que calcule el valor de un número decimal redondeado a una cantidad n de números decimales. no puedo usar ninguna de las funciones de la biblioteca de c++.
por el momento este es mi codigo.

#include <iostream>
using namespace std;

double redondear(double num, int dec)
{
    if(dec==1)
    {
        double redondeo=int(num+0.5);
        return redondeo;
    }
    return 0;
}

grossgore

Cita de: juanjoxdlol en 29 Marzo 2018, 23:20 PM
tengo que escribir una función redondear que calcule el valor de un número decimal redondeado a una cantidad n de números decimales. no puedo usar ninguna de las funciones de la biblioteca de c++.
por el momento este es mi codigo.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

double redondear(double num, int dec)
{
    if(dec==1)
    {
        double redondeo=int(num+0.5);
        return redondeo;
    }
    return 0;
}

Los códigos deben ir en etiquetas GeSHi

dijsktra

El problema es bonito.  Sucede que no se puede plantear como tú haces, ya que la función redondeo solo te puede dar -- el redondeo a la parte entera.

Te acuerdas cuando aprendiste a dividir con papel y lápiz a mano? Pues se trata de hacer lo mismo pero más rápido por computador.

Los números racionales, desde tiempos de la Grecia clásica, se conciben como "razón" entre dos números enteros (p y q ). Como los griegos no conocían el 0, cosa que lastró el desarrollo de matemáticas en Occidente, esta definición no plantea problemas.

Pero nosotros, desde tiempos de los arabes que los trajeron de la India (la de verdad, no la que creyó encontrar Colón en Santo Domingo  :xD :xD , saludos a los hermanos de Santo Domingo) , debemos completar esta definición exigiendo "q > 0"

Atendiendo a su representación decimal, se pueden dividir en dos

  • enteros, los que no tienen parte decimal propiamente
  • decimales, los que tienen parte decimal, ya sea finita o infinita periódica

En nuestro caso, vamos a considerar los enteros como un caso especial de los decimales, con una serie infinita de decimales con el dígito 0.   3 ~ 3.00000000000000000000000000000000......
O sea que el "primer decimal" , será el orden de unidades, el segundo de las décimas, el tercero de las centésimas...

#include <stdio.h>


/* Formal Spec
   P : N >= 0 , p>=0 , q > 0
   Q :
     rat(p/q) - (p/q + \sum i : 1 <= i <= N : pow(10,-i)*((r_{i-1}*10)/q)
      <= pow(10,-N)

   where r_{0} = p%q ;
         r_{n+1} = r_{n}*10 % q

   Informally, any rational number can be expressed with arbitrary precission
   just by operating its sucessive remainders.
*/
void exprDecUpToN(const int p, const int q,
                   int V[], const int N)
{
  int n,r;
  for(n=1, V[0]=(p/q), r=(p%q);n<N;n++)
    {
      V[n] = (10*r)/q;
      r = (10*r)%q;
    }
  return;
}

#define MAX 10000
int main(int argc, char **args)
{
  int N,p, q, V[MAX];
 
  for (; scanf("%d %d %d",&N,&p,&q)==3 ; )
    {
      exprDecUpToN(p,q,V,N+1);
      int n;
      printf("%d.",V[0]);
      for (n=1; n<N+1; n++) printf("%d",V[n]);
      printf("\n");
    }
  return 0;
}



Y ahora unos ejemplos de ejecución. El protocolo de entrada exige primerto meter el número de decimales deseado, el primer entero y el segundo (recuerda que debe ser mayor qie 0).
Llama la atención el último que es decimal infinito periódico.


1 1 2
0.5
2 1 2
0.50
4 56 8
7.0000
18 1 3
0.333333333333333333
2 3 4
0.75
4 3 4
0.7500
40 56 8
7.0000000000000000000000000000000000000000
500 47 7
6.7142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857142857
Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)