Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tangente (https://www.clubdelphi.com/foros/showthread.php?t=38556)

bosterito 19-12-2006 00:20:42

Tangente
 
¿Porque cuando pongo tan(Pi/2) me devuelve -3.6893.........., siendo que en realidad se debería producir una indeterminación?. Tengo muchos problemas con la funcion tangente (tan);

seoane 19-12-2006 00:38:03

La función tan utiliza la instrucción FPTAN para calcular la tangente. La tangente de pi/2 no es una indeterminación, es igual a infinito, y eso es precisamente lo que te esta devolviendo, el número mas alto que puede.

Aquí tienes explicada la instrucción FPTAN
http://www.website.masmforum.com/tut...ap10.htm#fptan

roman 19-12-2006 03:53:18

¿Y por qué Assert(IsInfinity(Pi/2)) falla?

// Saludos

seoane 19-12-2006 04:19:58

Cita:

Empezado por roman
¿Y por qué Assert(IsInfinity(Pi/2)) falla?

// Saludos

Hola roman, supongo que la pregunta es para mi. :confused: También supongo que con IsIninity te refieres a IsInfinite, y que donde dices pi/2, te refieres a tan(pi/2). Si no es así corrígeme.

De todas formas, yo lo que dije es que te daba el numero mas alto que podía, no dije que fuese "infinito". Y además tengo mis dudas de que la función IsInfinite funcione en este caso, ya que su parámetro esta definido como un double mientras que el resultado de "tan" es un extended. Puede que este ultimo punto sea una tontería, tendría que comprobarlo mejor ...

De todas formas lo que es innegable es que la tan(pi/2)=x/0 y que x/0, por lo menos cuando yo estudiaba matemáticas, es igual a infinito, no una indeterminación :p

roman 19-12-2006 04:28:01

Ja, ja, ¡cuántos errores en una sola línea! :D

La pregunta era más que nada para saber del funcionamiento de la unidad Math. Se supone que funciones como IsInfinite y la constante INFINITE están para tratar estos casos, o al menos eso creía yo.

// Saludos

seoane 19-12-2006 04:37:21

Cita:

Empezado por roman
La pregunta era más que nada para saber del funcionamiento de la unidad Math. Se supone que funciones como IsInfinite y la constante INFINITE están para tratar estos casos, o al menos eso creía yo.

Yo supongo que también, pero la limitación nos viene impuesta en este caso por la unidad de punto flotante, que al parecer para esta función el valor mayor que puede dar como resultado es ese. :confused: Sus razones tendrán.

De todas formas, para el caso nos viene dando igual. En la mayoría de los cálculos un valor MUY alto en lugar de infinito servirá, y si tenemos mucho interés en detectar cuando realmente es infinito. Un par de If convenientemente colocados y listo :p

roman 19-12-2006 04:42:54

Cita:

Empezado por seoane
Un par de If convenientemente colocados y listo

Claro, algo como

Código Delphi [-]
if IsInfinite(X) then
  ...

:D

// Saludos

seoane 19-12-2006 04:55:43

:D Pues ya ves, estaba pensando en hacer la gracia de poner esto:

Código Delphi [-]
var
  X: Extended;
  tanX: Extended;
  EsInfinito: Boolean;
begin
  X:= pi/2;
  EsInfinito:= (Sin(X)/Cos(X)) = Infinite;
  tanX:= tan(X);
  if EsInfinito then
    ShowMessage('El Resultado es infinito: ' + FloatToStr(Sin(X)/Cos(X)))
  else
    ShowMessage(FloatToStr(tanX));
end;

:( Pero, imagínate, el resultado de Sin(pi/2)/Cos(pi/2) es -3,68934881474191E19 :D :D . Bueno parece que ya tenemos un nuevo valor para definir el infinito :eek:

AzidRain 19-12-2006 05:49:17

No es mas sencillo verificar los valores antes de hacer el cálculo?? Ahi podria determinarse si el resultado sera Infinito o si será una indeterminación (0/0, cero sobre cero) y ya. Después de todo esos resultados son conocidos sin necesidad de hacer el cálculo. Es como si se quisiera dividir entre cero, para que esperarse a que brinque el error...

seoane 19-12-2006 12:49:00

Cita:

Empezado por AzidRain
No es mas sencillo verificar los valores antes de hacer el cálculo?? Ahi podria determinarse si el resultado sera Infinito o si será una indeterminación (0/0, cero sobre cero) y ya. Después de todo esos resultados son conocidos sin necesidad de hacer el cálculo. Es como si se quisiera dividir entre cero, para que esperarse a que brinque el error...

:D AzidRain, con eso me refería cuando dije lo de usar un par de If. El ultimo código intentaba ser una broma. Pero ya veo que no era tan evidente :p

AzidRain 20-12-2006 02:15:20

Glup! GluP! y requete Glup! :)


La franja horaria es GMT +2. Ahora son las 05:34:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi