no tiene sentido este simple código.

Iniciado por AprendiendoAProgramar, 25 Enero 2017, 23:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

ivancea96

¿Qué compilador utilizas y qué versón?

En cualquier caso, si solo es vas a elevear a 2 o a 3, es preferible que pongas x*x o x*x*x. Es más simple, y bueno, evitas trabajar con coma flotante.

Oh y, en tu código, ¿qué muestra si cambias "int a" por "float a"?

AprendiendoAProgramar


El compilador que viene en Code::Blocks el GNU GCC Compiler supongo. :silbar:


Si, se que es más simple pero solo quería probar esa librería y darle uso por si se me ocurría elevar a la 45 de un numero.

Y cambiando int por float curiosamente si da 25, que raro, no entiendo como es posible jajaja  ;D
APENAS EMPIEZO CON ESTO DE LA PROGRAMACIÓN Y CUANDO APARECEN ERRORES ES ALGO COMO........



(ES SOLO HUMOR)

engel lex

es error de precisión por el float! XD

mira el enlace que dejé para que veas como está armado el float

vas como mucho poder elevar 2 a la 45... como unsigned int 2^32 es el maximo y con unsigned long int el maximo es 2^64, otros valores, especialmente floats los puedes llegar pero sin precisión
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

AprendiendoAProgramar

¿Pero hay alguna forma o compilador para arreglar ese desfase de bits ? :silbar: :silbar: :silbar: :silbar: :silbar:



Muchas gracias por las respuestas,gracias  :D
APENAS EMPIEZO CON ESTO DE LA PROGRAMACIÓN Y CUANDO APARECEN ERRORES ES ALGO COMO........



(ES SOLO HUMOR)

ivancea96

También podría ser la CPU. GCC, por lo menos en mi versión, convierte el float a int con el opcode FISTPL. ¿Usas un ordenador antiguo o algo notable?
Si quieres, puedes probar a ejecutar el mismo programa en otro PC. Lo compilas y pasas el ejecutable al otro pc, a ver qué resultado te da.

do-while

#15
Si yo fuese tu utilizaría el tipo de dato que me devuelve pow que, si mal no recuerdo, como en ¿casi? todas las funciones de math.h (cmath) es double.

Si vas a asignar o mezclar variables de distintos tipos en una expresión tienes que tener en cuenta las reglas de promoción. Si a una variable le asignas el valor de otra de menor tamaño no tendrás pérdida de datos: char->int->float->double. Si a una variable le asignas el valor de otra de mayor tamaño tendrás un truncamiento (perdida de datos, sigue la lista anterior en orden inverso).

Lo anterior se traduce en que si a un entero le asignas el valor de una variable de tipo real (float/double) vas a perder datos (en el mejor de los casos perderás decimales), como en este caso, que 24'99999 pasa a ser 24.

Cuando aplicas las reglas de promoción a expresiones (operadores aritméticos/paso de parámetros) lo que pasa es que un operador promociona las variables para que sean del tipo de la de mayor tamaño involucrada en la operación. Por ejemplo int = int + float -> se promociona a float el operando int para ajustar su tamaño  al del otro operando (float)-> int = float + float -> int = float -> perdida de datos. Otro ejemplo: una función con lista de parámetros (lo que sea, double, lo que sea)-> llamada: (lo que sea, int, lo que sea) -> promocionamos el int para que sea del tipo declarado en el prototipo. Si fuese a la inversa, con prototipo declarado como (lo que sea, int, lo que sea) y llamamos con datos (lo que sea, float, lo que sea) habría una perdida de datos al forzar la conversión de float a int.

No se si ha quedado claro o no. Lee sobre el tema y tenlo en cuenta a la hora de escribir cualquier código, así evitarás problemas y errores derivados del truncamiento, que por cierto, como no son errores del lenguaje el código compilará, pero se producirán errores lógicos en tiempo de ejecución,  muy difíciles de localizar en el código.

Por ejemplo imagina que tienes una condición if(Cuadrado(x) == 25) ... En este caso la condición habría sido falsa, pero posiblemente tu al revisar el código hubieses dado por válida la expresión y te habrías vuelto loco intentando encontrar el error en otra parte.

¡Saludos!

(Por si no te ha quedado claro, las reglas de promoción las aplica el compilador al crear el binario, no nosotros. XD)
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!