PDA

Ver la Versión Completa : Tangente


bosterito
19-12-2006, 00:20:42
¿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/tutorials/fptute/fpuchap10.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
¿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
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
Un par de If convenientemente colocados y listo

Claro, algo como


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:


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
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! :)