Ir al contenido


Foto

¿En que afectan las directivas $N y $S?


  • Por favor identifícate para responder
24 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 marzo 2012 - 01:32

¡Hola a todos!
Tanto tiempo si estar por aquí. Estoy muy "distraído" con mi proyecto y me está robando tiempo, como así también quemando neuronas  :p

Les comento:
Dispongo de una unidad que forma parte de una biblioteca de cálculos. A esta unidad yo la tomo como base para mi propio desarrollo ya que ofrece unas funciones básicas para mi. Yo llamo a esta unidad "control".
El asunto es que tengo dos desarrollos, de pruebas y producción, que toman como base a esta unidad de control. En el 1ro tengo por decir de algún modo la versión 1.0 y básica de mis unidades, y en el 2do las versiones 2.0.

A ambos desarrollos los someto a las mismas pruebas y aparentemente los resultados van siendo coherentes con los esperados, pero durante una de las tantas pruebas a la que son sometidos los resultados detecto para el 2do desarrollo discrepancias entre un "control"  y el otro y por tanto no supera la prueba. Y naturalmente, en la misma medida mis unidades se ven afectados a esto.
Es decir: los resultados entre las unidades "control" para cada uno no coinciden (en un 100%)

Ambas unidades "control" son una copia EXACTA de la unidad original de la biblioteca, salvando un detalle menor, que cambio el nombre de unas constantes y el nombre a una función. En lo que hace a la lógica y el código no hay cambios... ¡y ya lo comprobé con incluso con la utilidad de CnPack!

Salvando los cambios en lo que hace a mis propias unidades, tanto para el 1er desarrollo como para el 2do, ambos deben realizar lo mismo y llegar a los mismos resultados (considerando un margen de error de tolerancia que yo defino; of course); la versión 2.0 tiene sus mejoras y añadidos obviamente. La única diferencia que percibo entre ambos proyectos es que en el 1ro dispongo de la unidad Math.

La unidad Math, al menos en D6, tiene las directivas:



delphi
  1. {$N+,S-}



En la ayuda no encuentro nada al respecto, y por tanto he aquí mi pregunta ¿En que afectas estas directivas? O es que yo soy muy bestia pero en la wiki de embarcadero viendo la lista de directivas ¡no esta!  :|

¿Alguien sabría decirme algo al respecto de éstas directivas y que tomar en cuenta?

Saludos,
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 marzo 2012 - 05:46

Pues parece que efectivamente no están documentadas estas dos directivas. Así lo ha dejado en claro  Arvid Winkelsdorf en un comentario realizado a David I en su blog.
El asunto es que tras leerme esto, y esto todavía no me queda en claro si es que me conviene o no. Mi bad english!
Aparentemente sin Math los cálculos no convergen a los resultados óptimos. Voy a probar en un proyecto en blanco a ver que sale con y sin Math; y también a revisar si la biblioteca en alguna parte también hace uso de Math o bien activa alguna directiva.

Ha decir verdad me quedo en blanco. Es la primera vez que me doy con esto... He operado antes con coma flotante y sin problemas, con y sin Math de por medio.

Saludos,
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 24 marzo 2012 - 07:30

Aunque no soy muy dado a estos temas me pregunto si existe en versiones posteriores de Delphi siendo que no hay rastro de su función.


Saludos!
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 marzo 2012 - 07:52

Aunque no soy muy dado a estos temas me pregunto si existe en versiones posteriores de Delphi siendo que no hay rastro de su función.


Saludos!

¿Que versión utilizas Felipe? ¿Entonces, tu no tienes declarada esas directivas en Math? En D6 puede verse al principio de la unit:




delphi
  1. { *********************************************************************** }
  2. {                                                                        }
  3. { Delphi / Kylix Cross-Platform Runtime Library                          }
  4. {                                                                        }
  5. { Copyright © 1996, 2001 Borland Software Corporation                  }
  6. {                                                                        }
  7. { *********************************************************************** }
  8.  
  9. unit Math;
  10.  
  11. { This unit contains high-performance arithmetic, trigonometric, logorithmic,
  12.   statistical, financial calculation and FPU routines which supplement the math
  13.   routines that are part of the Delphi language or System unit.
  14.  
  15.   References:
  16.   1) P.J. Plauger, "The Standard C Library", Prentice-Hall, 1992, Ch. 7.
  17.   2) W.J. Cody, Jr., and W. Waite, "Software Manual For the Elementary
  18.     Functions", Prentice-Hall, 1980.
  19.   3) Namir Shammas, "C/C++ Mathematical Algorithms for Scientists and Engineers",
  20.     McGraw-Hill, 1995, Ch 8.
  21.   4) H.T. Lau, "A Numerical Library in C for Scientists and Engineers",
  22.     CRC Press, 1994, Ch. 6.
  23.   5) "Pentium™ Processor User's Manual, Volume 3: Architecture
  24.     and Programming Manual", Intel, 1994
  25.  
  26.   Some of the functions, concepts or constants in this unit were provided by
  27.   Earl F. Glynn ([url=http://www.efg2.com]www.efg2.com[/url]) and Ray Lischner ([url=http://www.tempest-sw.com]www.tempest-sw.com[/url])
  28.  
  29.   All angle parameters and results of trig functions are in radians.
  30.  
  31.   Most of the following trig and log routines map directly to Intel 80387 FPU
  32.   floating point machine instructions.  Input domains, output ranges, and
  33.   error handling are determined largely by the FPU hardware.
  34.  
  35.   Routines coded in assembler favor the Pentium FPU pipeline architecture.
  36. }
  37.  
  38. {$N+,S-}
  39.  
  40. interface
  41.  
  42. uses SysUtils, Types;



Y por ésto que dice en los comentarios:

This unit contains high-performance arithmetic, trigonometric, logorithmic,
  statistical, financial calculation and FPU routines which supplement the math
  routines that are part of the Delphi language or System unit


es que ando sospechando hasta que, o en que afecta porque en la documentación no dice más al respecto. Dice que reemplaza a algunas rutinas que son parte de Delphi y en parte a las de System.  Y como en la mayoría de los desarrollos, a esa unidad System la utilizamos hasta para sonarnos los mocos  :D o dicho de otra manera, es indispensable.

Saludos,
  • 0

#5 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 24 marzo 2012 - 08:13

Pues tengo que revisar en mi versión Turbo del 2006 a ver que hay, sin embargo me refiero es a si también existen en las versiones XE.


Saludos!
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 marzo 2012 - 08:34

Según lo dicho por David I en el blog a mi me da entender que la directiva viene desde Turbo Pascal, por lo que es posible que por cuestiones de compatibilidad AUN esté esta directiva.
Ahora bien, lo único que logro entender de eso es que con $N+/- controlo el uso del co-procesador; si es que lo tiene y allí termina la explicación.

De $S no encontré nada  :|

Saludos,
  • 0

#7 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 24 marzo 2012 - 02:39

En Turbo Delphi 2006



delphi
  1. { *********************************************************************** }
  2. {                                                                        }
  3. { Delphi / Kylix Cross-Platform Runtime Library                          }
  4. {                                                                        }
  5. { Copyright © 1996-2005 Borland Software Corporation                    }
  6. {                                                                        }
  7. { Copyright and license exceptions noted in source                        }
  8. {                                                                        }
  9. { *********************************************************************** }
  10.  
  11. unit Math;
  12.  
  13. { This unit contains high-performance arithmetic, trigonometric, logarithmic,
  14.   statistical, financial calculation and FPU routines which supplement the math
  15.   routines that are part of the Delphi language or System unit.
  16.  
  17.   References:
  18.   1) P.J. Plauger, "The Standard C Library", Prentice-Hall, 1992, Ch. 7.
  19.   2) W.J. Cody, Jr., and W. Waite, "Software Manual For the Elementary
  20.     Functions", Prentice-Hall, 1980.
  21.   3) Namir Shammas, "C/C++ Mathematical Algorithms for Scientists and Engineers",
  22.     McGraw-Hill, 1995, Ch 8.
  23.   4) H.T. Lau, "A Numerical Library in C for Scientists and Engineers",
  24.     CRC Press, 1994, Ch. 6.
  25.   5) "Pentium™ Processor User's Manual, Volume 3: Architecture
  26.     and Programming Manual", Intel, 1994
  27.  
  28.   Some of the functions, concepts or constants in this unit were provided by
  29.   Earl F. Glynn ([url=http://www.efg2.com]www.efg2.com[/url]) and Ray Lischner ([url=http://www.tempest-sw.com]www.tempest-sw.com[/url])
  30.  
  31.   All angle parameters and results of trig functions are in radians.
  32.  
  33.   Most of the following trig and log routines map directly to Intel 80387 FPU
  34.   floating point machine instructions.  Input domains, output ranges, and
  35.   error handling are determined largely by the FPU hardware.
  36.  
  37.   Routines coded in assembler favor the Pentium FPU pipeline architecture.
  38. }
  39.  
  40. {$N+,S-}
  41.  
  42. interface
  43.  
  44. uses SysUtils, Types;




Eso ya parece una duda existencial Delphuis :p


Saludos!
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 24 marzo 2012 - 05:41

Ya no es cosa de algo de versión, sino que así es como está diseñado Delphi; como es de esperar:
al emplear Math el compilador buscará sacar el mejor provecho forzando a utilizar el coprocesador matemático que disponen la mayoría (sino todos) de los equipos.
Esto es bueno ya que se utilizará en bajo nivel las instrucciones Fxxx que están especialmente diseñadas para trabajar con FPU; y además el procesador se gana un respiro.
Visto de este modo utilícese Math siempre que pueda cuando esté por trabajar con punto flotante.

La cosa es la directiva $S. La palabrita que leo en el comentario en el blog dice: Segment Size Preference and/or Stack-Overflow Checking. Es decir que, supuestamente, controla el tamaño de segmento y/o el control de desbordamiento de pila. Aquí yo me digo ¡WTF!
Que no se haga control de desbordamiento de pila es very, very bad. Y se ve bien clarito... S-

Ahora bien, lo que logré encontrar sobre $S es en freePascal.org, y desconozco si valdrá lo mismo para Delphi.

No se en que puede favorecer ese S-; y/o porqué lo debe hacer.  A menos que por diseño del pipeline del coprocesador se vea obligado a esto no logro entenderlo semejante decisión.

Me voy a hacer a unas pruebas.

Saludos,
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 marzo 2012 - 12:03

Hola!

¡Ya no se me ocurre absolutamente nada de nada!  8o|  :@
Hice una prueba en un proyecto en blanco, tome a "control", lo copié, someto a prueba con uno de mis datos de ejemplo y recibo los mismos que en la "versión 2.0" cuando los más adecuados y precisos, y que cumplen con todas las condiciones, son los que se obtienen del control en 1.0.
Inicialmente pensé que era por no usar Math, pero añadir Math sigue igual. Por tanto ya queda descartado que sean las directivas que están en esta las causantes.
Para asegurarme de que no exista alguna diferencia entre ambos controles, desde 2.0 agrego al proyecto el control de 1.0 y modifico el código para invocar a la rutina de éste, un simple:



delphi
  1. res := UControl1.HacerEsto;



Para que tengan idea.

Y obtengo el mismo resultado que si hiciera un:



delphi
  1. res := UControl2.HacerEsto;



Por tanto esto comprueba que ambos son equivalentes y no hay diferencia alguna.

Ya he revisado todas las configuraciones del proyecto, que son las mismas que por defecto y nada... están idénticos. Incluso a este nuevo proyecto de prueba lo diseñé siguiendo la misma dependencia de unidades, a fin de que sea equivalente al 1.0.
En lo único que varían es que en 1.0 hago uso de algunos controles (y unidades por tanto) que no en este de prueba. Hice a la interfaz de este 2.5, por darle un nombre, muy simple.
Estuve pensando que quizá dentro de algunas de estas unidades se establece alguna directiva global que afecta a los resultados. Añadí las unidades "faltantes" y aún así sigue en las mismas.

No se en donde más ver... ¿ideas?  :|  :

Sino no me queda más que enviarles una copia de estos proyectos a ver que me dicen.

Saludos,
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 marzo 2012 - 08:50

Adjunto los proyectos.
En sistema1 está la versión 1.0. La unidad de "control" lleva por nombre UOriginal. Si prueban con el ejemplo1 el llamado control no van a encontrar resultados. Esto se debe a que inicialmente había llamado control a una implementación propia basada en la unidad base de la biblioteca. Con el que ha de evaluar resultados es Original.
En Sistema2 no hay mucho para decir, sólo se corre la unidad de "control" y está disponible el ejemplo1 para pruebas.

Los resultados para garantizar que son óptimos a la tolerancia permitida deben cumplir lo siguiente:
1) V es ortogonal Es decir que el producto escalar Vi * Vj para todo i y j tal que i <> j sea 0 y que Vi * Vi = 1.
2) AVi = LiVi siendo Li el autovalor i-ésimo. Nótece que AVi es el producto matricial. Para una tolerancia 1.0E^-n, entonces Avi-LiVi <= 1.0E^(-n/2) aproximadamente debido a efectos de visualización según precisión y cantidad de decimales configurados a ser mostrados.

Si prueban con 1.0 verán que efectivamente se cumple ambas condiciones. Yo para facilitar las cosas (bueno, me dió un tanto de flojera hacerlo vía código  :p )  hice la pruebas de condición en Excel. Tengan en cuenta que como la cantidad de decimales está fijada según la constante y que FormatFloatF redondea de ser necesario el último dígito, es posible y de esperarse que al calcular la ortogonalidad se obtuvieran 0,999... y/o 1,00..01
Mientras que con el otro sólo logra cumplir (1).

Espero que se me entienda. O es que yo estoy loco o es que mi máquina está hechizada; o ambas  ^o|

Saludos,

Archivos adjuntos


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 marzo 2012 - 07:14

En XE2, viene diferente, por el asunto de x86



delphi
  1. {
  2.   .........
  3.   .........
  4.   Routines coded in x86 basm favor the Pentium FPU pipeline architecture.
  5. }
  6.  
  7. {$N+,S-}
  8. {$POINTERMATH ON}
  9.  
  10. {$IFDEF CPUX86}
  11.   {$DEFINE X86ASM}
  12. {$ELSE !CPUX86}
  13.   {$DEFINE PUREPASCAL}
  14. {$ENDIF !CPUX86}



Saludos
  • 0

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 marzo 2012 - 08:24

Hola,
Eliseo si que viene con sus diferencias; aunque en esencia es lo mismo nota que sigue manteniendo la directiva $N+ y $S-
La directiva $POINTERMATH ON no la conozco, es muy probable que ésta sea para posteriores versiones.

Es de esperarse que haya incorporado directivas condiciones dependiente de las arquitecturas.

Ya me he convencido que mi problema no es de la unidad Math o de sus directivas porque al probar la unidad control 1.0 en otro proyecto ya sea que tengo o no la unidad Math me da los mismos e idénticos resultados que la control 2.0.
Pero de que algo tiene ese 1.0 seguro seguro... Es muy raro porque incluso le hice modificaciones a propósito al control 1.0 para obligarle a recrear el dcu al compilar. Y aún así sus resultados satisfacen las pruebas; algo que no logro con 2.0 cuando sus código es el mismo.

Hoy voy a hacer una prueba directa, forzando lo más posible la utilización de Math y aprovechando una buena cantidad de funciones que dispone sabiendo que están diseñadas para sacarle el mayor provecho a la FPU. Así diseñaré una versión 3.0 de control, a ver que me sale.
Lo máximo que se me ocurre pensar es que resultase que mi equipo no contase con coprocesador  ^o|

Saludos,
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 marzo 2012 - 06:27

Hola,
¡Pues me rindo!  :  8o| Definitivamente no se que de raro, diferente, o que... es lo que hace a que control 1.0 opere como $Deity manda (como diría Wardog  :D ) y cualquier otra implementación que haga no llegue a esos resultados.

¿Algún entendido que pudiera analizar los archivos que he adjuntado y pueda decirme algo al respecto? Porque de lo que entiendo, veo y analicé ambos proyectos tienen las mismas configuraciones, el código es una copia directa... es más si copian control 1.0 y lo llevan a un proyecto en blanco, o lo utilizaran en 2.0 obtendrán los mismos resultados que en 2.0. ¿Entonces, que hace de peculiar a 1.0?
Ojalá alguien pudiera echarme alguna luz.

He hecho una prueba, con la unidad Math y para que el compilador si o si tome las directivas, y supuestas mejoras que esto implica en el uso de la FPU adapté el código tanto para que utilice funciones como IsZero(), CompareValue(). Ahora mostré hasta 15 decimales.
Hice en este nuevo proyecto la prueba máxima Av-Lv = 0 y obtengo apenas 1/4 cuanto mucho de lo esperado.

En este caso para hacerlo corto, probé a comparar los resultados de este nuevo control 3.0 con una de mis implementaciones, el algoritmo Ciclico (también potenciado con las supuestas mejoras y aprovechamiento de Math), y no... los resultados son casi idénticos.
Adjunto este nuevo proyecto 3.0.

Saludos,

Archivos adjuntos


  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 marzo 2012 - 12:32

Hola a todos,
¡Paren las imprentas! (Siempre he querido decir eso  :D )

Ya está, he logrado ver la iluminación divina, he encontrado la solución, ya se donde está el error.
El error estuvo SIEMPRE en la capa 8 del modelo OSI  :p

Fui yo el p****udo MANAZAS bestia y pedazo de animal cegatonto, maldormido y palomo quien cometía las atrocidades de confundir un vector columna como un vector fila.  8o|  8o|  8o|  :|  :|  :|

¡Me quiero pegar un tiro! El control 1.0 funciona simplemente porque muestra la matriz de vectores como corresponde, vector columna a vector columna. En los otros desarrollos yo de grandísimo &%$?@!# en vez de mostrar a columnas estuve SIEMPRE mostrando a fila a fila. Y Claro entonces cuando volcaba a excel para hacer las pruebas no pasaba ni de coña.

¡Dos semanas entre planificación, análisis, escritura de código, mejoramiento de versiones, pruebas, y hasta de lectura de código, tanto en máquina como en papel y yo no me daba cuenta.
Ya no puedo caer más bajo... ¡por favor alguien deme en la cabeza con un martillo!  :@  :|  8o|

¡Doy por resuelto el misterio muchachos! Se va otro post-it a mi monitor que diga: NO CONFUNDIR COLUMNAS CON FILAS ¡BESTIA!

Saludos,
PD: ¡Comprar post-it de calidad, los trucos no pegan ni con mocos!  :p
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 29 marzo 2012 - 01:11

Fui yo el p****udo MANAZAS bestia y pedazo de animal cegatonto, maldormido y palomo


Me has ganado, eso mismo te iba a comentar :)

Saludos
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 29 marzo 2012 - 01:13

Caramba!!!!

No era eso lo que queria decir, era esto:

Fui yo quien cometía las atrocidades de confundir un vector columna como un vector fila.


:D :D :D

Saludos

  • 0

#17 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 marzo 2012 - 02:46

Lo más peor de todo es que después de una semana es que recién caigo del error. Y yo que me volvía loco por ver donde estaba el error, pensando que había algo malo en mis algoritmos cuando en realidad el problema era solo un defecto de presentación.
Errores tontos como éstos suelo cometer... pero no tan sostenidos en el tiempo como esta vez. Antes los sacaba en no más de 3 días  :o  :|  : ¡Necesito vacaciones!  :D

Saludos,
  • 0

#18 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 29 marzo 2012 - 03:35

Yo desde el principio iba a decir: seguro algo tiene que ver con que confundes columnas con filas, pero supuse que te sería más provechoso darte cuenta tu mismo  *-) *-) *-) *-) *-)

:D :D :D :D :D :D :D :D :D :D :D :D :D

:angel:

.....
Ya no puedo caer más bajo... ¡por favor alguien deme en la cabeza con un martillo!  :@  :|  8o|
......


Cuánto salvajismo  :| :| :|, unos cuantos zapes no servirán ???  *-) *-) *-)

Saludox ! :)
  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 marzo 2012 - 08:33

Yo desde el principio iba a decir: seguro algo tiene que ver con que confundes columnas con filas, pero supuse que te sería más provechoso darte cuenta tu mismo  *-) *-) *-) *-) *-)

:D :D :D :D :D :D :D :D :D :D :D :D :D

:angel:

Te voy a acusar con mi mamá por llegarme a producir dementitis matrixis y no haberme dicho antes Jajaja.



Cuánto salvajismo  :| :| :|, unos cuantos zapes no servirán ???  *-) *-) *-)

Saludox ! :)

No creo, ya estoy muy descompuesto... ¡como será que el mecánico optó por directamente reemplazar los tornillos y tuercas por unos nuevos! y los pequeños zapes no funcan... como a todo cachivache con mañas de un hogar, se me arregla con golpes bien dados y duros.  :D

Estaba pensando que tal vez para quitarme lo de manazas lo bueno sería también darme con un mazo en las manos  :D

Saludos,
  • 0

#20 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 30 marzo 2012 - 07:00

Conclusión... nada que ver peras con manzanas, en este caso, las directivas y la aplicación.
Necesitas vacaciones (y):p



Saludos!
  • 0




IP.Board spam blocked by CleanTalk.