1/10000000 = 0, o cantidades similares dan igual a cero

115 views
Skip to first unread message

josé antonio contreras gonzález

unread,
Sep 12, 2016, 1:33:02 PM9/12/16
to Comunidad de Visual Foxpro en Español
Saludos!

Actualmente estoy programando en Visual FoxPro 9 y estoy realizando Razones matemáticas desde un SELECT, donde realizo 2 casos, Numerador_Grande / Denominador_pequeño (ejemplo 10000000 / 1) y Numerador_pequeño / Denominador_Grande (ejemplo 1/10000000).

El resultado es que en el primer caso, no tengo problemas, obtengo el resultado ya sea en decimales o en notación científica, pero sin problema.

El segundo caso es el que no esta marchando, comencé realizando el siguiente calculo: 3 / 3e+19 y me dio resultado cero
hice algunas otras pruebas, hasta que encontré lo que más o menos es un limite, 1 / 10000000, hasta ahí, me sigue dando un resultado de cero, si le quito un cero o más ceros al denominador, visual foxpro me dará el resultado correcto, si le pongo los 7 ceros o más ceros, invariablemente visual foxpro me da cero como resultado.

Claro que si hago crecer el numerador también evito el error, así que podríamos decir que el error ocurre cuando el resultado de la división supera a 0.0000001, ni usnado STR() o TRANSFORM() evito el error, estos comando simplemente me dan una cadena de ceros con el formato que yo pida.

Los cálculos que realizo son parecidos al que indique primero, 3 / 3e+19, así que estoy estancado.

¿Alguien sabe si es debido a una configuración, o se le ocurre alguna forma de lograr obtener el resultado correcto? de preferencia dentro del SELECT, ya que las razones las realizo con un SELECT que obtiene la información de una tabla.

Gracias por su atención!

Fabio Ramirez

unread,
Sep 12, 2016, 3:56:44 PM9/12/16
to Comunidad de Visual Foxpro en Español

Hola jose..

Como tienes los valores en SET DECIMALS TO 

intenta con esto a ver que tal SET DECIMALS TO 16

josé antonio contreras gonzález

unread,
Sep 12, 2016, 4:44:51 PM9/12/16
to Comunidad de Visual Foxpro en Español
Gracias por responder Fabian

Ya seguí tu recomendación y me hace lo mismo

¿Tienes instalado FoxPro?

¿puedes ejecutar este código en tu ventana de comandos y ver si a ti te da el resultado correcto?


?1/10000000

Patricio Muñoz

unread,
Sep 12, 2016, 4:57:05 PM9/12/16
to publice...@googlegroups.com
a mi me pasa lo mismo
--
Patricio Muñoz
Pro&Tech
Analista en Sistemas

josé antonio contreras gonzález

unread,
Sep 12, 2016, 5:01:20 PM9/12/16
to Comunidad de Visual Foxpro en Español
Estoy trabajando con denominadores de 19 dígitos y numeradores que no sobrepasan 2 dígitos, así que imagínate, este problema le da al traste a mi programa, porque solo calcula ceros, je je, lo cual es del todo incorrecto. ¿habrá un modo de sacarle la vuelta y obtener el resultado correcto?




El lunes, 12 de septiembre de 2016, 15:57:05 (UTC-5), extremo escribió:
a mi me pasa lo mismo

Mario López

unread,
Sep 12, 2016, 5:13:26 PM9/12/16
to Comunidad de Visual Foxpro en Español
@José Antonio: lo que ves es una limitación de la aritmética de punto flotante (ver https://docs.python.org/2/tutorial/floatingpoint.html si te interesa una explicación más precisa). En http://www.tek-tips.com/viewthread.cfm?qid=1738764 y http://www.tek-tips.com/viewthread.cfm?qid=1738661 hay explicaciones específicas sobre VFP.

Quizá te pueda ser de utilidad la clase BIGNUM de Rick Hodgin (https://github.com/RickCHodgin/libsf/tree/master/source/xbase/bignum) que supuestamente te permite operaciones sobre números de precisión arbitraria, yo no la usé así que no sé si funciona bien o no.

HTH
Mario

---

josé antonio contreras gonzález

unread,
Sep 12, 2016, 5:28:25 PM9/12/16
to Comunidad de Visual Foxpro en Español
Saludos Mario!

Gracias por tus recomendaciones!

Por hoy tengo que dejar la computadora, así que mañana le echare una revisada a la información que compartes y si me funciona marcare como Finalizada la respuesta

Gracias por su cooperación.

Víctor Hugo Espínola Domínguez

unread,
Sep 12, 2016, 5:38:46 PM9/12/16
to publice...@googlegroups.com
Prueba usando logaritmos:

? EXP(LOG(1)-LOG(10000000))

Pero debes tener en cuenta que:

Digits of precision in numeric computations. Visual FoxPro can handle numbers up to 9007199254740992 (2^53) in exact computations.

16

Miscellaneous:

64 bits = 8 bytes

Largest number = 10 ^ 308 = 2 ^ 1023

-> 10 bits per exponent + 1 for exponent sign plus 1 for number sign => 12 bits

Leaving 52 bits for the mantissa + 1 for implied normalized bit -> 53 bits

LOG10(2^53) = 15.95 decimal digits accuracy



Saludos,
Víctor.
Lambaré - Paraguay.

Víctor Hugo Espínola Domínguez

unread,
Sep 12, 2016, 5:42:47 PM9/12/16
to publice...@googlegroups.com
Otro detalle a tener en cuenta:  los tipos de datos de la expresión

Set Decimal To 16
? 1.0/10000000.0


Saludos,
Víctor.
Lambaré - Paraguay.


El 12 de septiembre de 2016, 17:38, Víctor Hugo Espínola Domínguez<vich...@gmail.com> escribió:
Prueba usando logaritmos:

? EXP(LOG(1)-LOG(10000000))

Pero debes tener en cuenta que:

Digits of precision in numeric computations. Visual FoxPro can handle numbers up to 9007199254740992 (2^53) in exact computations.

16

Miscellaneous:

64 bits = 8 bytes

Largest number = 10 ^ 308 = 2 ^ 1023

-> 10 bits per exponent + 1 for exponent sign plus 1 for number sign => 12 bits

Leaving 52 bits for the mantissa + 1 for implied normalized bit -> 53 bits

LOG10(2^53) = 15.95 decimal digits accuracy



Saludos,
Víctor.
Lambaré - Paraguay.

Carlos Miguel FARIAS

unread,
Sep 12, 2016, 5:46:14 PM9/12/16
to Grupo Fox
La solución sería enviar el resultado a un campo tipo double (creo que código de campo B)
CREATE CURSOR Resultados (tuCampo B(16))
REPLACE tuCampo WITH numerador_pequenio / denominador_grande
Pero igual, no tienes más de 18 dígitos decimales de precisión.
Ver en la ayuda campo double
Saludos: Miguel, La Pampa (RA)

francisco prieto

unread,
Sep 12, 2016, 7:38:20 PM9/12/16
to Grupo Fox
Carlos, ya probe  asi

SELECT  CAST(1/10000000 AS numeric(20,18)) FROM Tabla


SELECT  CAST(1/10000000 AS float(20,18)) FROM Tabla

eso da siempre 0

sin embargo la idea de Victor funciona...

SELECT  EXP(LOG(1)-LOG(10000000)) FROM Tabla

Eso si no recuerdo nada de logaritmos como para arribar a la conclusion de porque funciona.

Saludos,

Pancho
Córdoba
Argentina

Víctor Hugo Espínola Domínguez

unread,
Sep 12, 2016, 7:53:33 PM9/12/16
to publice...@googlegroups.com
Se debe a que las funciones logarítmicas devuelven resulatdos del typo DOUBLE, por eso también ? 1.0/100000000.0 muestra el resultado correcto.

Para comprender mejor prueben este código:

CREATE CURSOR miCursor (Dividendo B(16), Divisor B(16))
INSERT INTO miCursor VALUES (1, 100000000)

SELECT Dividendo / Divisor As Cociente FROM miCursor


Saludos,
Víctor.
Lambaré - Paraguay.


El 12 de septiembre de 2016, 19:38, francisco prieto<fajp...@gmail.com> escribió:
Carlos, ya probe  asi

SELECT  CAST(1/10000000 AS numeric(20,18)) FROM Tabla


SELECT  CAST(1/10000000 AS float(20,18)) FROM Tabla

eso da siempre 0

sin embargo la idea de Victor funciona...

SELECT  EXP(LOG(1)-LOG(10000000)) FROM Tabla

Eso si no recuerdo nada de logaritmos como para arribar a la conclusion de porque funciona.

Saludos,

Pancho
Córdoba
Argentina
El lun., 12 sept. 2016 a las 18:46, Carlos Miguel FARIAS (<carlosmig...@gmail.com>) escribió:
La solución sería enviar el resultado a un campo tipo double (creo que código de campo B)
CREATE CURSOR Resultados (tuCampo B(16))
REPLACE tuCampo WITH numerador_pequenio / denominador_grande
Pero igual, no tienes más de 18 dígitos decimales de precisión.
Ver en la ayuda campo double
Saludos: Miguel, La Pampa (RA)

francisco prieto

unread,
Sep 12, 2016, 7:57:42 PM9/12/16
to publice...@googlegroups.com
Victor,

Pero porque funciona con logaritmo natural y no con logaritmo decimal...

En fin debo reconocer que funciona, pero si me podes enviar el link a la explicacion matemática te lo voy a agradecer.

Saludos y gracias,

Pancho
Córdoba
Argentina

Víctor Hugo Espínola Domínguez

unread,
Sep 12, 2016, 7:58:37 PM9/12/16
to publice...@googlegroups.com
Otro ejemplo:

CREATE CURSOR miCursor (Dividendo I, Divisor I)

INSERT INTO miCursor VALUES (1, 100000000)

SELECT CAST(Dividendo As B(16)) / CAST(Divisor As B(16)) As Cociente FROM miCursor


Saludos,
Víctor.
Lambaré - Paraguay.


francisco prieto

unread,
Sep 12, 2016, 8:13:52 PM9/12/16
to publice...@googlegroups.com
A ver,

Lo que pude encontrar es que 

log (a/b) = log (a) - log (b)

Pero eso no significa que 

a/b= log (a) - log (b)

Por eso creo que debe haber una explicacion al respecto...

Saludos,

Pancho
Córdoba
Argentina

francisco prieto

unread,
Sep 12, 2016, 8:24:37 PM9/12/16
to publice...@googlegroups.com
Victor,

Creo que voy entendiendo

EXP() y LOG() son operaciones inversas entre si... 

Por lo tanto lo que hiciste fue despejar...

A ver

x=1/10000000

por propiedad de logaritmo

log(x)=log(1/10000000)

es decir que 

log(x)=log(1)-log(10000000)

Pero yo quiero averiguar X entonces

x=Exp(log(1)-log(10000000))

Me costo... pero lo entendi...

Gracias,

Pancho
Córdoba
Argentina

Víctor Hugo Espínola Domínguez

unread,
Sep 12, 2016, 8:31:02 PM9/12/16
to publice...@googlegroups.com
Exactamente, EXP es lo que en el cole aprendimos como ANTILOGARITMO

Con logaritmos en base 10 es así:

? 10.0**(LOG10(1) - LOG10(10000000))

El antilogaritmo de base 10 es 10 elevado a la potencia logaritmo de la expresión

francisco prieto

unread,
Sep 13, 2016, 3:15:42 AM9/13/16
to publice...@googlegroups.com
Excelente Victor!

Gracias por el aporte matemático...

Al fin le encontre una aplicacion práctica a los logaritmos!!!

Saludos,

Pancho
Córdoba
Argentina

josé antonio contreras gonzález

unread,
Sep 13, 2016, 10:24:39 AM9/13/16
to Comunidad de Visual Foxpro en Español
Saludos!

Gracias por responder!

La verdad es que la respuesta de los logaritmos esta excelente!

y funciona, ya hice la prueba desde 1/1 hasta 1/1e+35 y me da el resultado, bueno, con estas curiosidades

al dividir 1/1e+15 da 1.000E-15, correcto
al dividir 1/1e+16 da 9.999E-17, ¿correcto?
al dividir 1/1e+17 da 9.999E-18, ¿correcto?
al dividir 1/1e+18 da 1.000E-18, correcto

y los mismos caso del 9.999 ocurre para 1e+23, 1e+25, 1e+32, 1e+34, 1e+35

bueno, hasta ahí le pare, porque me pareció suficiente para los datos que estoy trabajando

por mi parte es una respuesta satisfactoria para marcar como finalizado el tema.

Muchas gracias por su cooperación

Newbie

unread,
Sep 13, 2016, 3:13:37 PM9/13/16
to Comunidad de Visual Foxpro en Español
Disculpa la curiosidad cual la aplicación de esto,???

josé antonio contreras gonzález

unread,
Sep 13, 2016, 3:20:32 PM9/13/16
to Comunidad de Visual Foxpro en Español
Saludos!

No es la gran cosa, es una aplicación que calcula razones de una encuesta compleja y luego les calcula su varianza por el método jackknife.

pero en mi caso, utilice una tabla que contenía un ponderador muy alto, que provoco numero superiores a los 10,000,000 que al entrar a esta parte de la formula, me dio resultados en cero, como lo describo en el tema, y de ahí no salí, por eso me atrevi a preguntar, si era un problema de visualfox o problema de mala programación.
Reply all
Reply to author
Forward
0 new messages