Tengo un extraño problema con C++, donde el tipo de datos largos se desborda mucho antes de lo debido. Lo que estoy haciendo (con éxito hasta ahora) es hacer que los enteros se comporten como flotantes, de modo que el rango [-32767,32767] se mapee a [-1.0,1.0]. Donde tropieza con los argumentos es de mayor tamaño que representa flota superior a 1,0:C++ desbordamiento prolongado prematuramente
inline long times(long a, long b) {
printf("a=%ld b=%ld ",a,b);
a *= b;
printf("a*b=%ld ",a);
a /= 32767l;
printf("a*b/32767=%ld\n",a);
return a;
}
int main(void) {
printf("%ld\n",times(98301l,32767l));
}
Lo que obtengo como salida es:
a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775
-32775
así veces (98301,32767) es análoga a 3.0 * 1.0. Este código funciona perfectamente cuando los argumentos a veces son menores que 32767 (1.0), pero ninguno de los pasos intermedios con los argumentos anteriores debe desbordar los 64 bits de longitud.
¿Alguna idea?
¿Puede aceptar la respuesta, hace que las personas estén más dispuestas a ayudarlo en el futuro? –