pues puedo decir que me suena casi todo eso a chino pero he estado experimentando antes de tu respuesta y he visto cosas:
1- No sirve usar:
Código C:
Ver originaldouble a,b;
b=a=DBL_MAX;
a++;
if(b > a)
es curioso pero en ese caso a y b valen igual incluso habiendo incrementado una de ellas.
2- No sirve el truco:
Código C:
Ver originaldouble a=DBL_MAX;
a++;
__asm{
pushad
pushfd
pop eax
mov flags, eax
popfd
popad
}
if(flags & (1<<11))
No se activa el flag de overflow.
3- Hice esto:
Esto me suelta una excepcion diciendo que se ha desbordado. ¿se podria usar try catch para controlar si se produjo overflow en un double? ¿eso seria una locura?
Para controlar la entrada de scanf encontre una solucion mas o menos razonable:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
//#include <math.h>
#define BEEP 7
#define MAX 20
#define POS_INF 1.0 /0.0;
#define NEG_INF -1.0/0.0;
double leer_double(void) {
double x;
char a[MAX], *p, c;
int i, encontrado = 0;
if(errno == ERANGE){
if(x==0){
x= NEG_INF;
}else{
x= POS_INF;
}
}else{
for(i = 0; i < MAX; i++){
if(a[i] == '\n'){
encontrado = 1;
break;
}
}
if(*p != '\n'){
printf("%c",BEEP
); /* Aviso de error */
if(encontrado == 0){
do{ /* Ciclo para vaciar el resto que haya quedado en el buffer stdin */
}while(c != '\n');
}
x=0;
}
}
return x;
}
int main() {
double d;
printf("Introduce un valor: "); d = leer_double();
return 0;
}
¿que os parece esta solucion? ¿cambiariais algo?