FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
||||
|
||||
Cosa de locos
Hola amigos del foro.
Tengo un problema que me está volviendo loco . El problema es que tengo un valor que lo veo en el wath, pero la comparación dice que no es igual. Ahí les mando el código:
Salu2 Última edición por dec fecha: 20-12-2006 a las 07:51:10. |
#2
|
||||
|
||||
Adivina, adivinanza...
|
#3
|
||||
|
||||
Y esto???
Cita:
En este caso me gustaria poder poner el avatar de jachguate. No entiendo nada... Saludos |
#4
|
||||
|
||||
Sé más específico, con que variables, en que línea de código...
Recuerda las buenas costumbres al escribir código, como la indentación.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca |
#5
|
||||
|
||||
Parece que nos encontramos ante otro misterioso caso de optimización de código
bosterito, lo que ocurre es lo siguiente como no utilizas el valor de "va" para nada, el compilador, que es muy listo, simplemente omite todo ese código innecesario. Por ejemplo, prueba a colocar esto en tu código:
Ahora ya utilizamos la variable va para algo, así que el compilador ya no puede omitir ese bloque de código. |
#6
|
||||
|
||||
Hola a todos.
El código que puse es un ejemplo. El problema que tengo es la parte del if, porque la matriz tiene algunos elementos con el valor 1.5707963268, pero cuando llega a la parte del if, nunca entra, siendo que debería hacerlo. A continuación va el código: Código:
Procedure Dibujar( Matriz : Tmatriz1 ); var Bloque, Ancho, Alto, i, j : Integer; Pendiente, X0, Y0 : Real; begin Bloque := 16; Alto := 7; j := 1; while ( Alto <= (Form1.Image1.Picture.Bitmap.Height - ( (Bloque div 2)+1 ) ) ) do begin Ancho := 7; i := 1; while ( Ancho <= (Form1.Image1.Picture.Bitmap.Width - (( Bloque div 2 )+1) ) ) do begin if ( Matriz[j,i] = 1.5707963268 )then begin Pendiente := tan(Matriz[j,i]); X0 := 1; Y0 := 1; Obtener_Puntos( X0, Y0, Pendiente ); X0 := X0-1; Graficar ( Ancho, Alto, X0, Y0, clFuchsia, 3 ); end; inc(i); Ancho := Ancho + 16; end; Alto := Alto + 16; inc(j); end; Form1.Label1.Caption := 'ya está'; end; |
#7
|
||||
|
||||
No entiendo, el codigo de "ejemplo" y el real no se parecen en nada. No entiendo porque no pusiste el codigo "real" la primera vez. No lo entiendo ...
Volviendo a tu pregunta, tu dices lo siguiente: Cita:
|
#8
|
||||
|
||||
|
#9
|
||||
|
||||
Este hilo tiene el misterio de un cuento de navidad, con sorpresa incluida, el que era, ahora no es, el que es, no es el que parecía que era, jejeje...
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código Únete al grupo Teaming clubdelphi | Colabora mediante Paypal Última edición por Casimiro Notevi fecha: 20-12-2006 a las 21:25:27. |
#10
|
|||
|
|||
Solo quiero comentar que si el código ejemplo es similar al código real (según tú) a nadie beneficia haber mostrado el primero, es decir, no se ha resuelto tu problema y por otro lado pienso que le hiciste perder el tiempo a la gente que amablemente trato de colaborar.
Tu problema es específico en el código real y nunca se va a localizar el mismo error/problema/defecto (llamalo como quieras) en el código ejemplo. Hasta pronto Edito: Lo único congruente es el titulo del hilo (COSA DE LOCOS)
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
#11
|
|||
|
|||
No es posible que si se cumplen las condiciones no entre al if, ¿seguro que no en alguno de los bucles while no se cumple y sale?
|
#12
|
||||
|
||||
Disculpá Seoane, pero lo que hice fué porque pensé que haciendo esto iba a resultar mucho más simple la comprensión de mi problema. Con la ayuda que me diste si me funciona para el ejemplo 1 pero cuando quise adaptar la situación para mi problema real (ejemplo 2), sigo con el mismo problema. Te agradecería una respuesta favorable de tu parte, ya que estoy trabado y no puedo avanzar en el tema. Desde ya muchas gracias.
|
#13
|
||||
|
||||
Pero todavía sigo sin saber como llenas los valores de la matriz La única razón para que no entre en el if, es que no se cumpla la condición. No te fíes de la información que se ve en los watch, tratándose de valores de punto flotante puede que se trate de una aproximación y no del valor real. Por eso te preguntaba, como llenabas la matriz, para estar seguro de que valores se guardaban en ella. Si pudieras poner el código, donde llenas la matriz, por lo menos a mi, me aclararía muchas cosas.
|
#14
|
||||
|
||||
Mientras pones algo mas de codigo, permiteme adivinar un par de soluciones.
Esto es lo que tienes ahora:
Solución 1:
Solución 2:
PD: Para que funcione, necesitas incluir en la uses la unit math. |
#15
|
||||
|
||||
Hola Seoane
Ahí pongo algo de código Código:
Type Tmatriz1 = array[1..16,1..16] of Real; // Aquí defino la matriz Código:
Theta := Angulo1 ( Gxx, Gyy, Gxy ); // En esta función se obtiene un determinado ángulo Angulos[(((Alto+Bloque-1) div Bloque), ((Ancho-1) div Bloque)] := Theta; //Aquí le asigno el valor a la matriz |
#16
|
||||
|
||||
¿Has probado las soluciones que te propuse? ¿funcionaron o sigues teniendo el mismo problema?
|
#17
|
||||
|
||||
Cita:
Las comparaciones de tipos que tienen decimales es uno de los mayores problemas que hay en el mundo de la PC, al menos para mí ; es un problema inherente al diseño del procesador para almacenar y manejar las precisiones y no es específico a un lenguaje, vamos, no es de Delphi. Yo lo viví en carne propia al crear una aplicación para tratamiento de señales de sensores que deben ser procesados con precisiones de 9 posiciones decimales, o mejor dicho 0.00000001 unidades de error máximo en los cálculos, ncluyendo las maditas comparaciones de floats. También me quebré la cabeza y por 2 semanas investigando la comparación que fallaba a partir de los 6 decimales y en el Watch salían valores <> 0 (por eso nunca entraba al if) al restar el valor comparado contra el valor de la condición, que según yo y la lógica de este universo eran valores iguales; y buscando por Internet encontré la causa, que es la forma cómo el procesador almacena y reconstruye el valor original (que al final no siempre resulta el original); como no es entero, usa una serie de estratagemas para almacenar la parte decimal. La solución en mi caso fué limitar la precisión máxima de 9 decimales para todos los cálculos, truncando lo demás. Para esto se puede usar SimpleRoundTo de la unidad Math ó la combinación de RoundTo / SetRoundMode. Sería algo similar al hilo quedarme con Centésimas en un float. Saludos
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Están locos estos romanos | dec | Humor | 3 | 09-10-2006 11:49:32 |
Los virus estan mas locos cada dia | el_barto | Noticias | 6 | 14-09-2005 17:54:18 |
...de locos... | Jure | Humor | 2 | 23-08-2004 12:43:20 |
¿Estamos locos o que? | kokoon | Humor | 3 | 28-05-2004 21:25:33 |
Locos | obiwuan | Humor | 0 | 13-05-2003 19:05:19 |
|