Abril 22, 2018, 10:05:27 pm

Autor Tema: [C] No exceder los limites mínimo y máximo soportado por el tipo float.  (Leído 3867 veces)

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

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Hola, gente.
Alguien sabe cómo establecer los valores mínimo y máximo que soporta el tipo float en C. resulta que deseo que al ingresar un número por teclado se valide precisamente que no exceda el mínimo y el máximo soportado por el tipo float. -
Les dejo el programa para que tengan una idea de lo que deseo hacer, como lo tengo hecho no es coherente la validación.-

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <float.h>

float suma( float o1, float o2 );
float resta( float o1, float o2 );
float division( float o1, float o2 );
float multiplicacion( float o1, float o2 );


int main( void ){
float (*ptrf[]) ( float, float ) = {suma, resta, division, multiplicacion};
int ok, ch, opc;
float opeUno, opeDos, result;

printf( "\n ========== Calculadora ==========\n\n" );

do{
printf("\n Introduzca el primer operando....:");
ok = scanf("%g", &opeUno) == 1 && opeUno >= FLT_MIN && opeUno <= FLT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

do{
printf("\n Introduzca el segundo operando...:");
ok = scanf("%g", &opeDos) == 1 && opeDos >= FLT_MIN && opeDos <= FLT_MAX;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

printf( "\n 1 - Suma \n 2 - Resta \n 3 - Divide \n 4 - Multiplica" );
do{
printf( "\n\n Ingrese una opcion...:" );
ok = scanf("%d", &opc) == 1 && opc >= 1 && opc <= 4;
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

result = ( ptrf[opc-1] ) ( opeUno, opeDos );

printf( "\n El resultado es %g", result );

return 0;
}


float suma( float o1, float o2 ){
return o1 + o2;
}

float resta( float o1, float o2 ){
return o1 - o2;
}

float division( float o1, float o2 ){
return o1 / o2;
}

float multiplicacion( float o1, float o2 ){
return o1 * o2;
}

Saludos y desde ya muchas gracias.-
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.-

Desconectado OnTheCore

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1610
  • Sexo: Masculino
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #1 en: Mayo 07, 2016, 06:35:39 pm »
Podes hacer que la entrada de datos sea a un tipo de dato mas grande (en este caso podrías probar usando double, ya que tiene el doble de precisión que float) y fijarte que no exceda los valores máximos/mínimos del float. Si se da el caso, guardarlo en el float y si no se da el caso, que le diga al usuario que el número es demasiado grande/chico
No me mandes mensajes privados sobre troyanitos,  "crypters" o alguna otra boludez. No voy a ser tu maestro personal ni te voy a vender un curso para ser hacker. Si me envias un mensaje asi, probablemente no te guste la respuesta.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #2 en: Mayo 07, 2016, 07:28:35 pm »
Hola.
Pence en lo que me dices, pero todavía cabe la posibilidad de que se ingrese un número mayor a double y sigo teniendo el mismo problema. -
Lo que quiero es tomar el ingreso como cadena y luego validarlo, pero no encuentro la manera, por ejemplo con int si me sale perfecto porque tiene un número literal en cambio en float aparece como notación científica y hay todo mal. -

Un abrazo.       

Desconectado OnTheCore

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1610
  • Sexo: Masculino
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #3 en: Mayo 07, 2016, 09:51:02 pm »
atof

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #4 en: Mayo 08, 2016, 08:03:09 am »
Hola.
Lo estoy intentando y me da como ingreso máximo el número que muestro en la imagen, ¿en tu compu da el mismo resultado?. -

Código: You are not allowed to view links. Register or Login
#include<stdio.h>

int main( void ){
double a = 9.00;
size_t i;

for( i = 1; i < 24; i++ ){
printf( "\n[%2u] ==> %f", i, a );
a *= 10.00;
}

return 0;
}


/*#include<stdio.h>
#include<stdlib.h>

int main( void ){
double a;
char buffer [256];
printf ( "\n Ingrese un numero.....: " );
gets (buffer);
a = atof (buffer);
printf ( "a = %f " , a);

return 0;
}*/



Saludos.

Desconectado OnTheCore

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 1610
  • Sexo: Masculino
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #5 en: Mayo 08, 2016, 10:18:57 am »
Un float es un número codificado en IEEE 754 en 32 bits. Un double es lo mísmo que un flotante, pero con el doble de precisión, es decir, de 64 bits (obviamente dependiendo de la arquitectura, pero supongo que estas programando para x86).
Vos estas superando ese límite.
Te recomiendo usar una librería de números grandes si tu objetivo es ese.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #6 en: Mayo 08, 2016, 08:23:56 pm »
Hola.
Citar
Te recomiendo usar una librería de números grandes si tu objetivo es ese.
No, lo que estaba aprendiendo es array de puntero a función y como no podía validar el ingreso de los 2 operadores postee el código para que me digan como lo harían. -

Saludos.

Desconectado MAFUS

  • Me das tu IP?
  • *
  • Mensajes: 2
  • Sexo: Masculino
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #7 en: Mayo 09, 2016, 09:01:11 am »
No puedes validar al 100% si directamente usas un tipo numérico para recoger el valor. El usuario puede escribir un número extremadamente grande (hasta que el intérprete de órdenes diga basta) y siempre superará el valor de cualquier tipo numérico de la máquina.
Por tanto debes recoger la entrada como cadena y validarla antes de convertirla en un valor numérico.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #8 en: Mayo 09, 2016, 10:18:54 am »
Hola, MAFUS.
Si te refieres a esto ya lo tenía hecho pero igual el máximo número que permite es a mi criterio muy pequeño, es un tipo de 8 bytes. -

Código: You are not allowed to view links. Register or Login
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>

int main( void ){
char tmp[21] = "";
size_t c, i, punto = 0;
double numero;

printf( "\n Ingrese el primer operando.....:" );
for( i=0; i<20; i++ ){
c = getchar(); /* extraigo carácter a carácter del buffer del teclado */
if( c == '\n' || c == '\0') /* si el carácter es el salto de línea, es el fin del ingreso  */
break;

if( i > 0 ){ /* no valido el primer caracter porque si no es -/+ o 0/9 atof debuelve 0.0*/
if( !(isdigit(c)) ){ /* si es distinto a un dígito */
if( c == '.' ) /* si es el punto (para separar el exponente de la mantisa) */
if( punto == 0 )/* si es el primer punto todo Ok. */
punto++; /* sumo uno a punto para que no se duplique */
else{
punto = 10;
break; /* de lo contrario finalizo, no puede haber 2 puntos */
}
else{ /* si llego aqui es porque el ingreso no corresponde a un punto ni 0/9 */
punto = 10;
break;
}
}
}
tmp[i] = c;
}

tmp[i] = '\0'; /* pongo el '\0' (final de la cadena) */

if( punto < 10 ){
numero = atof(tmp); /* utilizo "atof" para convertir la cadena "tmp" en un doble "numero" */
printf("\n El numero ingresado es........:%.4f", numero);
}
else{
printf( "\n El ingreso es incorrecto........:");
}

return 0;
}

Tú me dirás. -
Saludos.

Desconectado MAFUS

  • Me das tu IP?
  • *
  • Mensajes: 2
  • Sexo: Masculino
    • Ver Perfil
Re:[C] No exceder los limites mínimo y máximo soportado por el tipo float.
« Respuesta #9 en: Mayo 09, 2016, 10:37:52 am »
Se me ocurre que siendo el rango de los datos tipo float los valores comprendidos entre -3.402823466E+38 a -1.175494351E-38, 0, y de 1.175494351E-38 a 3.402823466E+38
Son 39 carácteres máximo, 40 si hay el signo negativo. Esto, junto a que solo puede haber, además de números, 1 caracter '-' y 1 caracter '.', a no ser que se use la notación científica, la criba se resuelve de forma más sencilla.


resuelto
Minimo y maximo de caracteres en un registro?

Iniciado por bcn_marc_18

3 Respuestas
1815 Vistas
Último mensaje Abril 15, 2011, 04:20:24 pm
por ActerMarking
smiley
Generar maximo y minimo de x numero de cifras en C.

Iniciado por pacosn1111

2 Respuestas
803 Vistas
Último mensaje Febrero 25, 2015, 01:45:36 pm
por pacosn1111
xx
Ayuda en fila secuencial de tipo float

Iniciado por Zoldier_X

0 Respuestas
1223 Vistas
Último mensaje Junio 02, 2008, 09:56:32 am
por Zoldier_X
xx
float

Iniciado por Arkhy

2 Respuestas
1215 Vistas
Último mensaje Julio 31, 2007, 07:38:18 am
por Arkhy
question
Distro con minimo consumo?

Iniciado por Manel92

3 Respuestas
1177 Vistas
Último mensaje Diciembre 16, 2009, 04:01:09 pm
por Dj_Dexter
xx
Algoritmo que da cambio con el numero minimo de monedas

Iniciado por csaralg

1 Respuestas
8642 Vistas
Último mensaje Agosto 13, 2008, 02:53:29 am
por csaralg
resuelto
duda con valor de retorno *int ó *float.

Iniciado por nano20sm

5 Respuestas
1407 Vistas
Último mensaje Abril 23, 2010, 10:20:08 pm
por nano20sm
xx
(Te lo modifico). Duda división float e int.

Iniciado por neo6982

9 Respuestas
3573 Vistas
Último mensaje Mayo 13, 2008, 02:08:48 pm
por kamui23
question
duda Agenda en Batcha, mínimo código me falta!!

Iniciado por TheEGG89

10 Respuestas
1719 Vistas
Último mensaje Octubre 20, 2010, 04:58:32 pm
por JaAViEr
exclamation
[Comando] Float.bat (Sumas y restas con decimales)

Iniciado por LauBuru

2 Respuestas
2362 Vistas
Último mensaje Junio 28, 2010, 05:45:35 pm
por Sthefano02