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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Establecer la cantidad de dígitos a la derecha de la coma [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Establecer la cantidad de dígitos a la derecha de la coma [C]  (Leído 8,560 veces)
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #10 en: 9 Enero 2016, 21:01 pm »

Me cuesta creer que haya algo que en C no se pueda hacer, seguiremos intentando, no me voy a dar por vencido tan pronto.
Desde luego se puede lograr. Como biens e ha dicho, la coma flotante trabaja con binario, y hay números contados que van a dar un resultado preciso. Si loq ue queires es saber lso decimales que tendrá un número introducido por el usuario, como bien has dicho, lee lo que el usuario ha introducido. scanf transforma cadenas a los tipso que le pongas.


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #11 en: 10 Enero 2016, 16:05 pm »

Hola.
Bueno el obsesivo Daniel sigue practicando, les dejo lo que cambie dentro del bucle, lo que muestra printf no se refleja en el bucle, al ser iguales las 2 cifras ¿por qué no sale del mismo? o lo que muestra printf no es real o exacto. -

Código
  1. while(x <= 6 ){
  2. decimal *=10;
  3. x++;
  4. temp = decimal + 1e-9;
  5. if( temp == decimal ) {break;}
  6. printf("\n decimal = %g ==> temp = %d", decimal, temp);
  7. }
  8.  



Saludos.


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #12 en: 10 Enero 2016, 16:50 pm »

Cuandpo a una variable flotante le sumas un flotante mucho menor, no se va a cambiar.
Para que lo veas con otro ejemplo, si a 10^1000 le sumas 1, va a seguir siendo 10^1000.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #13 en: 10 Enero 2016, 18:25 pm »

Si vas a buscar una fórmula matemática para conseguir los números, en base 10, que han escrito detrás de la coma te digo que conseguirías un hito. Para ello tienes dos vídeos que están relacionados.

Éste primero muestra como convertir un binario real a un decimal real:
https://www.youtube.com/watch?v=PtX_nWKMOxw

Y éste segundo muestra como convertir un real binario en su representación IEEE 754:
https://www.youtube.com/watch?v=VlX4OlKvzAk

Como puedes ver saber cuántos números decimales hay después de una coma en un real decimal es harto complicado.

Te será más fácil si lo haces en base a caracteres, como se ha mencionado anteriormente.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #14 en: 10 Enero 2016, 21:58 pm »

Hola MAFUS.
Me parece genial la idea, de echo es lo primero que pense para hacer que el programa logre el cometido pero luego recordé que las operaciones a nivel de bist se pueden aplicar únicamente a variables enteras, pero mirando el video se me antojo que lo puedo intentar con desplazamiento de bits, siempre utilizo el ampersand(&) para hacer este tipo de prácticas, el programa que dejo a continuación es una muestra de ello.-

Código
  1. #include<stdio.h>
  2.  
  3. int main( void ){
  4. int numero = 1854, i, b = 1, temp = 0, x;
  5.  
  6. for( i = 0; i < 32; i++ ){
  7. temp += numero & b;
  8. x = numero & b;
  9. if( x > 0 ) printf("\n bit encendido ==> [%d] = %d", i, x);
  10. b *= 2;
  11. }
  12.  
  13. printf( "\n\n La direccion de memoria %p contiene el valor %d\n\n", &numero, temp );
  14.  
  15. return 0;
  16. }

gracias ivancea96 por la aclaración.-   
A seguir intentando.
Saludos
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #15 en: 10 Enero 2016, 22:37 pm »

El manejo de bits es muy poderoso.

Un aporte:
Cuándo hagas el desplazamiento de bits, cómo haces en b *= 2; escríbelo como b <<= 1. Los desplazamientos de bits son más rápidos que las multiplicaciones. Ídem para las divisiones.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #16 en: 13 Enero 2016, 18:16 pm »

Hola a todos.
0xFer, mil disculpas por no prestar demasiada atención a lo que proponías en este post:http://foro.elhacker.net/programacion_cc/super_solucionado_separar_parte_decimal_y_parte_fraccionaria_en_lenguaje_c-t446426.0.html si bien es efectivo cuando la variable se inicializa a mano no sirve cuando la misma se le aplica el valor por teclado, no sirve porque aparentemente no se puede establecer cuantos decimales tiene un tipo de coma flotante, pero como Danielito es un tanto obsesivo sigue intentando.-
Lo que traigo ahora es la siguiente formula que en un papel y con la calculadora funciona, pero en el ordenador da resultado erróneo, yo quiero creer en una frase que me dijo un conocido (mío) exprogramador: Todo lo que puedas hacer con un lápiz y un papel yo lo puedo hacer con el ordenador.-

Un Ej. con el número .2155
.2155 * 10 = 2.155 le restamos la parte entera y nos queda .155 (1 decimal)
.155 * 10 = 1.55 le restamos la parte entera y nos queda .55 (2 decimales)
.55 * 10 = 5.5 le restamos la parte entera y nos queda .5 (3 decimales)
.5 * 10 = 5.0 le restamos la parte entera y nos queda cero (4 decimales)

El resultado es infalible, en el papel, pero en el programa que dejo a continuación no.- 

Código
  1. #include <stdio.h>
  2. #include <float.h>
  3.  
  4. int main( void ){
  5. double numero , decimal;
  6. int entero, contador = 0, ok, ch;
  7.  
  8. do{
  9. printf("\n Ingrese un numero con decimales...: ");
  10. ok = scanf( "%lf", &numero ) == 1 && numero > 0.00 && numero <= DBL_MAX;
  11. while ((ch = getchar()) != EOF && ch != '\n');
  12. }while(!ok);
  13.  
  14. entero = (int)numero;
  15. decimal = numero - entero;
  16.  
  17. while(decimal != 0 ){
  18. decimal = decimal * 10;
  19. decimal = decimal - (int)decimal;
  20. printf("\n Decimal...: %g", decimal);
  21. contador ++;
  22. }
  23.  
  24. printf("\n Total de digitos despues de la coma..:%d\n", contador);
  25.  
  26. return 0;
  27. }





Si todavía alguien desea decirme el porqué, muy pero muy agradecido.-

Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #17 en: 13 Enero 2016, 18:43 pm »

Sigue siendo más de lo mismo. Tu trabajas en decimal, el ordenador no. El ordenador trabaja en números binarios en coma flotante, y no solo eso: trabaja con una forma especial para que fue diseñada para que equipos de computación trabajen con números binarios, el IEEE 754.
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #18 en: 18 Enero 2016, 18:39 pm »

Bueno, .... está muy interesante el tema!

El problema parece ser que el redondeo a entero de un número teóricamente entero, no es necesariamente un "entero" desde el punto de vista de la máquina.
Entonces cuando multiplicamos por 10, nunca llegamos a obtener un "entero" desde el punto de vista de la máquina.

Probé a hacer lo siguiente, incluir la biblioteca <math.h>, y mandar a imprimir en cada ciclo la diferencia entre el número actual, y el redondeo del mismo. Lo imprimimos en notación científica para apreciar mejor el orden de magnitud del número
Código
  1. while( contador < 20 && fabs(numero - round(numero)) != 0 ) {
  2.        contador++;
  3. numero *= 10;
  4. printf("Numero es ...: %lf, van: %d decimales\n", numero, contador );
  5. printf("  Diferencia: %.2E\n", fabs(numero - round(numero)));
  6. }
  7.  
(donde la condición del contador menor a 20 es para prevenir ciclo infinito). El resultado será

 Ingrese un numero con decimales...: .2155
1.19E-07
Numero es ...: 2.155000, van: 1 decimales
  Diferencia: 1.55E-01
Numero es ...: 21.550000, van: 2 decimales
  Diferencia: 4.50E-01
Numero es ...: 215.500000, van: 3 decimales
  Diferencia: 5.00E-01
Numero es ...: 2155.000000, van: 4 decimales
  Diferencia: 4.55E-13
Numero es ...: 21550.000000, van: 5 decimales
  Diferencia: 3.64E-12
Numero es ...: 215500.000000, van: 6 decimales
  Diferencia: 2.91E-11
Numero es ...: 2155000.000000, van: 7 decimales
  Diferencia: 4.66E-10
Numero es ...: 21550000.000000, van: 8 decimales
  Diferencia: 3.73E-09
Numero es ...: 215500000.000000, van: 9 decimales
  Diferencia: 2.98E-08
Numero es ...: 2155000000.000000, van: 10 decimales
  Diferencia: 4.77E-07


Pero vemos que el algún momento la diferencia entre ambos es un número muy pequeño, teóricamente cero pero que en la práctica no es cero. Debe ser un número menor al épsilon de la máquina, el cual desde el punto de vista teórico debemos tomaralo como un cero. Por lo tanto detenemos el ciclo cuando la diferencia entre el número y su redondeo sea menor a dicho épsilon:
Código
  1. while( contador < 20 && fabs(numero - round(numero)) > FLT_EPSILON ) {
  2.    contador++;
  3.    numero *= 10;
  4.    printf("Numero es ...: %lf, van: %d decimales\n", numero, contador );
  5.    printf("  Diferencia: %.2E\n", fabs(numero - round(numero)));
  6. }
  7. }

Con lo cual se obtiene lo esperado

 Ingrese un numero con decimales...: .2155
1.19E-07
Numero es ...: 2.155000, van: 1 decimales
  Diferencia: 1.55E-01
Numero es ...: 21.550000, van: 2 decimales
  Diferencia: 4.50E-01
Numero es ...: 215.500000, van: 3 decimales
  Diferencia: 5.00E-01
Numero es ...: 2155.000000, van: 4 decimales
  Diferencia: 4.55E-13

 Total de digitos despues de la coma..:4


De todos modos, creo que lo más seguro en estos casos sigue siendo recibir el número como cadena, y convertirlo internamente a número según un algoritmo implementado directamente por nosotros. Creo que así debe ser la manera como trabajan los intérpretes de comandos como cmd, o bash

Un saludo, Yoel
Puedes enviarme un M.P.



Por cierto, respondiendo este post tuve que editar el mensaje como 10 veces, recortarlo, editarlo por partes, etc ....

El servicio anti-DOS me enviaba una alerta de "Attention Required", como que supuestamente estaba intentando invadir el foro con Scripting Injection. Lo cual es totalmente falso, entonces no se por qué el anti-DOS me rebotaba a cada rato. A lo mejor estaba malinterpretando como nocivas las etiquetas "code", o "tt"
« Última modificación: 18 Enero 2016, 18:52 pm por Eternal Idol » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Establecer la cantidad de dígitos a la derecha de la coma [lenguaje C]
« Respuesta #19 en: 18 Enero 2016, 18:52 pm »

Por cierto, respondiendo este post tuve que editar el mensaje como 10 veces, recortarlo, editarlo por partes, etc ....

El servicio anti-DOS me enviaba una alerta de "Attention Required", como que supuestamente estaba intentando invadir el foro con Scripting Injection. Lo cual es totalmente falso, entonces no se por qué el anti-DOS me rebotaba a cada rato. A lo mejor estaba malinterpretando como nocivas las etiquetas "code", o "tt"

Crea un hilo en: https://foro.elhacker.net/sugerencias_y_dudas_sobre_el_foro-b10.0/
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] Establecer detalles de un EXE
Programación Visual Basic
aaronduran2 5 5,898 Último mensaje 2 Septiembre 2009, 15:37 pm
por aaronduran2
[Python] - Cantidad de Dígitos
Scripting
ChicoMaravilla 4 14,811 Último mensaje 7 Diciembre 2010, 02:31 am
por lnvisible
Establecer ruta con nircmd(solucionado)
Scripting
Dark Invader 3 2,880 Último mensaje 6 Agosto 2011, 22:17 pm
por SuperDraco
[SOLUCIONADO] Permitir solo una coma en un textbox
.NET (C#, VB.NET, ASP)
Eleкtro 4 5,724 Último mensaje 15 Enero 2013, 16:48 pm
por Eleкtro
limitando cantidad de digitos en jtextfield Netbeans
Java
jelsir 3 3,044 Último mensaje 30 Julio 2016, 22:41 pm
por Once
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines