PDA

Ver la Versión Completa : detectar numeros negativos


Cosgaya
29-05-2006, 21:46:16
como puedo detectar cuando una variable integer ( en delphi 7) contiene un numero negativo ?
gracias

vtdeleon
29-05-2006, 21:48:23
si es menor a 0
if variable < 0 then

roman
29-05-2006, 22:07:10
if Abs(variable) <> variable then

// Saludos

seoane
29-05-2006, 22:42:32
Es curioso, pero en el caso de los double existe el -0.0 :D

reevil
29-05-2006, 22:46:22
Es curioso, pero en el caso de los double existe el -0 :D

:confused: que utilidad tiene eso? :confused:

seoane
29-05-2006, 22:54:34
que utilidad tiene eso?
Ninguna, se debe a que se utiliza un bit para indicar el signo. Asi que puede darse la situacion en que el valor sea 0 pero el bit de signo indique que es negativo. Mas que ser util es molesto pues hay que tenerlo en cuenta a la hora de comprobar si un numero es igual a 0

roman
29-05-2006, 22:59:51
¿Puedes poner un ejemplo de código en dónde esto que mencionas se refleje?

// Saludos

reevil
29-05-2006, 23:10:06
... hay que tenerlo en cuenta a la hora de comprobar si un numero es igual a 0

-0 es distinto de 0 ?? :eek:

seoane
29-05-2006, 23:15:48
Sin ir mas lejos y siguiendo con el tema del hilo, Delphi usa la siguiente funcion para comprobar el signo de un double.


function Sign(const AValue: Double): TValueSign;
begin
if ((PInt64(@AValue)^ and $7FFFFFFFFFFFFFFF) = $0000000000000000) then
Result := ZeroValue
else if ((PInt64(@AValue)^ and $8000000000000000) = $8000000000000000) then
Result := NegativeValue
else
Result := PositiveValue;
end;


En el primer if comprueba si el valor es 0 eliminando primero el bit de signo, de esta manera 0.0 y -0.0 son considerados como un mismo numero.

Sin embargo, estuve haciendo pruebas y parece que delphi ya tiene en cuenta esta eventualidad a la hora de hacer comparaciones. Por ejmplo:


var
d1, d2: double;
begin
d1:= -0.0;
d2:= 0.0;
// Esto nos dice d1 es igual a d2
ShowMessage('(d1 = d2) = ' + BoolToStr(d1 = d2,TRUE));
// Sin embargo si comparamos bit a bit nos dice que no es asi
ShowMessage('(d1 = d2) = ' + BoolToStr(Comparemem(@d1,@d2,Sizeof(double)),TRUE));
end;


Vaya forma de darle vueltas al asunto :D

roman
29-05-2006, 23:54:20
Ok, pero, entonces, si tratamos a los double, como double, 0 y -0 sin lo mismo, ¿verdad?

// Saludos

seoane
29-05-2006, 23:56:49
Ok, pero, entonces, si tratamos a los double, como double, 0 y -0 sin lo mismo, ¿verdad?


Pues si, parece que si ...

Cosgaya
13-06-2006, 13:06:28
Gracias por las respuestas
me quedo con la primera que es la mas facilita
a las otras ya llegare:D :D :D