Con cuantos decimales calcula VFP

919 views
Skip to first unread message

mpulla

unread,
Jun 9, 2016, 12:57:17 AM6/9/16
to Comunidad de Visual Foxpro en Español
Buen Día.

Tengo un calculo que lo realizo en VFP 6.0 que son sumas y divisiones,el mismo proceso lo hago con Postgresql 9.5 64 bits, los resultados varían con muy poco, dese un 0.00189 a 0.00025 por registro, la diferencia total es aceptable.

Pienso que la diferencia se da por la cantidad de decimales que ocupa VFP y Posgresql para los cálculos, me gustaría saber a cuantos decimales calcula VFP, para tratar de cerrar la diferencia.

Saludos.
Mauricio

Daniel Sánchez

unread,
Jun 9, 2016, 12:16:52 PM6/9/16
to Comunidad de Visual Foxpro en Español
Si tus cálculos son para enviar un misil tele dirigido o una sonda a júpiter, yo creo que si seria importante dichas diferencias ya que si fuera un misil tele dirigido lo podrías estar enviando a otro país y en el caso de la sonda ya no sería a júpiter si no al infinito y más allá, pero en el caso de nuestros cálculos contables y financieros pues no creo que exista denominación monetaria para esos cálculos, normalmente el valor importante es a 2 dígitos y eso, para impuestos te piden valores sin decimales redondeados al entero superior.

Saludos
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Fernando D. Bozzo

unread,
Jun 9, 2016, 1:14:22 PM6/9/16
to Comunidad de Visual Foxpro en Español
Hola Mauricio:


Ese margen de error puede ser muy importante, o no, dependiendo de cómo lo apliques.

Por ejemplo, si 0.000189 es el costo de un sticker, la venta de un millón de stickers con un precio u otro hace que el precio de venta oscile entre $189 y $250, lo que es una diferencia importante.

Te convendría conocer mejor los tipos de datos numéricos de VFP (double, float, etc) y usar una precisión mayor en los cálculos.


Saludos.-

Jose Antonio Blasco

unread,
Jun 9, 2016, 1:16:44 PM6/9/16
to Comunidad de Visual Foxpro en Español
Hummm... no estoy tan de acuerdo.
Te cuento un caso que se me ha dado
Imaginate el consumo en millones de litros de combustible de una gasolinera en uno año.
Si sólo manejas el precio con 2 decimales, estarás desfasando los cálculos en un buen pellizco.
Para el cliente que te comento, tuvimos que trabajar a 6 decimales.

Un saludo.


Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

"No hay camino hacia la libertad, la libertad es el camino" - Indira Gandhi
“Nunca te olvides de sonreír, porque el día que no sonrías  será un día perdido”  -  Charles Chaplin
“Todo el mundo quiere tener un amigo, pero pocos se toman la molestia de ser uno”
- Anónimo

Carlos Miguel FARIAS

unread,
Jun 9, 2016, 1:55:46 PM6/9/16
to Grupo Fox
En el caso de la pregunta inicial de comparación de redondeo entre fox y postgresql de 64 bits, es simple, fox es de 32 bits, el otro de 64. La librerías son de los tamaños correspondientes a esos bits. No hay magia. VFP 32 bits, postgresql 64 bits. ooohh?
Para cálculos de importes lo mas preciso en VFP son los monetarios, porque en realidad calcula como enteros y el desplazamiento de los 4 decimales es virtual.
Igualmente, fox no maneja más de 18 dígitos de precisión, cualquier cálculo que salga de ese entorno se trunca por lo bajo. Por lo alto, da error.
Postgresql maneja esto
smallint 2 bytes integer -32768 to +32767
integer 4 bytes -2147483648 to +2147483647
bigint 8 bytes large-range -9223372036854775808 to +9223372036854775807
decimal variable up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
numeric variable up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
real 4 bytes variable-precision 6 decimal digits precision
double precision 8 bytes variable-precision, 15 decimal digits precision
y los seriales que son variantes de enteros.
Entonces, como pueden ver, postgresql gestiona 1000 veces más decimales que VFP 7000 veces digitos delante de la coma.
Y esto no es mágia, es el manual de postgresql
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe mientras hacen un programa que imprima todos los números posibles que puede gestionar postgresql.


Fernando D. Bozzo

unread,
Jun 9, 2016, 2:44:49 PM6/9/16
to publice...@googlegroups.com
Así es Carlos, las ventajas de los 64 bits son claras, pero igualmente, en general la precisión que permite VFP suele sobrar para la mayoría de los casos habituales, como el planteado.

Tomado de aquí (https://msdn.microsoft.com/es-es/library/3kfd3hw9(v=vs.80).aspx#Anchor_1) estas son las capacidades de VFP para trabajo con números:


Minimum value of an integer:
-2,147,483,647

Maximum value of an integer:
2,147,483,647

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

Miscellaneous:

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



Y aquí (https://msdn.microsoft.com/es-es/library/ww305zh2(v=vs.80).aspx) las de cada tipo de campo numérico:

Double (8 bytes)   +/-4.94065645841247E-324 to +/-8.9884656743115E307

Float / Numeric (8 bytes)   - .9999999999E+19 to .9999999999E+20

Integer (4 bytes)  -2147483647 to 2147483647

mpulla

unread,
Jun 9, 2016, 3:14:36 PM6/9/16
to Comunidad de Visual Foxpro en Español
Hola

Gracias a todos por sus respuestas.

Estoy migrando un sistema hecho en VFP 6.0 el cual hace los respectivos cálculos y los almacena en una tabla con campos numéricos con 8 decimales, tengo una función en postgresql que realiza los mismos cálculos y los resultados varían muy  poco, como dice Fernando el margen es aceptable dependiendo de cómo lo apliques.

Quiero saber a cuantos decimales calcula VFP para poder simularlo en Postgresql.

Saludos.
Mauricio

Fernando D. Bozzo

unread,
Jun 9, 2016, 3:36:48 PM6/9/16
to publice...@googlegroups.com
Mauricio, lo que preguntás ya te lo puse en el mensaje anterior.

Ahí tenés todas la información técnica sobre los datos numéricos y su precisión.


Saludos.-


Hugo C.

unread,
Jun 9, 2016, 6:57:55 PM6/9/16
to Comunidad de Visual Foxpro en Español
Para eso esta Fortlan (ups aún no es viernes)

Saludos.

Víctor Hugo Espínola Domínguez

unread,
Jun 9, 2016, 7:33:09 PM6/9/16
to publice...@googlegroups.com
Forlán ya no está en la selección, por eso perdieron ante México.

Saludos,
Víctor.
Lambaré - Paraguay.

Hugo C.

unread,
Jun 10, 2016, 5:17:17 PM6/10/16
to Comunidad de Visual Foxpro en Español
jeje, ya es viernes.

Saludos.

mpulla

unread,
Jun 11, 2016, 7:56:44 PM6/11/16
to Comunidad de Visual Foxpro en Español
Hola Fernando.

Tienes razón gracias.

Saludos.
Mauricio

Fernando D. Bozzo

unread,
Jun 11, 2016, 9:06:33 PM6/11/16
to publice...@googlegroups.com
No sé si se hayan dado cuenta, pero hay varios tipos de datos de VFP que son de 8 bytes (64 bits).

Eso se debe a que se usaba el estándar IEEE 754 que era muy popular en esa época, y usaban 2 pares de 4 bytes (32 bits cada par) para poder manejar números más grandes, pero este estándar tenía sus problemas y en 2008 se cambió a un estándar mejor.

Si les interesa más info sobre esto, les dejo estos links.

Visual FoxPro Data and Field Types
https://msdn.microsoft.com/en-us/library/ww305zh2(v=vs.80).aspx

Numeric Data Type
https://msdn.microsoft.com/en-us/library/kkeyy55s(v=vs.80).aspx

Nota: El link anterior describe el tipo numérico de VFP y sobre el final referencia al artículo KB Q78113 que describe resultados erróneos, que veo que fue sustituido por este nuevo artículo de la KB:
https://support.microsoft.com/en-gb/kb/78113

Aquí un debate en FoxWiki sobre este tema:
http://fox.wikis.com/wc.dll?Wiki~VFPFloatingPointDataType~VFP

Y finalmente, el estándar IEEE 754:
https://en.wikipedia.org/wiki/IEEE_754-1985


Saludos.-



Reply all
Reply to author
Forward
0 new messages