Archivo

Archivo para Sábado, 20 de noviembre de 2004

Historias del pasado: !Por favor señor, no vaya a apagar el Ciclotrón!

Sábado, 20 de noviembre de 2004



Leyendo Slashdot esta mañiana, me conseguí con un articulo titulado ‘Building a Cyclotron on a Shoestring‘ en el cual hablan de como un estudiante logró construir uno de pequeño tamaño cuando aún no habia terminado la carrea (la historia completa es asombrosa). Sin embargo mi cuento es por supuesto muchisimo más banal y me recordó los tiempos en los cuales yo salía tarde de el Diario El Universal para irme a mi casa (en este entonces no existian autofuturo.com, ni porlapuerta.com, sólo el sitio de clasificados.eluniversal.com (ya no existe). Yo y un amigo nos dirigiamos a la puerta para irnos cuando el guardia del turno de la noche nos detiene y nos empieza a hacer el interrogatorio habitual:


GuardiaEUD: Buenas noches caballeros, ¿me dicen sus nombres y en que piso trabaja?

Amigo: Mi nombre es XXXX y trabajo en el piso YYY, división de nuevos medios

GuardiaEUD: Ahhh, “Intelné

Yo: (pensando: @$@$% madre, que “Intelné” ni que ocho cuartos es nuevos medios, huev…)

Amigo: Si, Internet señor

GuardiaEUD: Ah, si, a mi me han dicho que en ese piso lo único que hacen es navegar todo el dia. ¿Que fino no?

Verga…, en ese momento algo se rompió dentro de mi cabeza y un instinto salvaje de insultar al carajo me poseyó; Pero entonces en un momento de claridad divina me decidí a joder al pobre guardía en una manera más sutil y perversa….


GuardiaEUD: (dirigiendose a mí) y ¿usted, cual es su nombre?

Yo: Yo señor, me llamo Diego de la Vega e Hidalgo

GuardiaEUD: (escribiendo) Dieeeeego de la Veeeega e Hidalgo

Yo: (verga, no puede ser) Si, asi mismo Diego de la Vega

Miro a mi amigo y veo que está a punto de cagarse de la risa. Le hago señas que se controle, hay que hacer pagar caro a este bastardo…


GuardiaEUD: ¿Y cual es su cedula?

Yo: !Anote allí!: 7..4…5…9…16….24…32..88 (note que cada número lo voy diciendo como si cantara número de lotería)

GuardiaEUD: 7..4…5…9…16… ¿dijo 25?

Yo: (molesto) No no !NO!. Es “..4…5…9…16….24…32..88″

Amigo: (nervioso) No, creo que José se equivocó, es 1x.xxx.xxx.

GuardiaEUD: !Ohh, OK! (con cara de borrego sorprendido en la pastura)

Yo: (aún soprendido que no me haya disparado a quemarropa). Mire, hay un problema en piso xxx, no vaya a apagar la luz allá

GuardiaEUD: ¿Porqué? Por orden de recursos humanos, nosotros tenemos que revizar que no quede nadie en las oficinas y hay que apagar TODAS las luces

Yo: (saboreando ya la victoria) Es que tenemos un ciclotrón.

GuardiaEUD: ¿Un ciclo-que?

Yo: (con tono de ladilla infinita) Dije un ciclotrón. Usted sabe, si usted lo apaga va a dañar todas las computadoras de nuevos medios y !usted no quiere hacer eso! ¿verdad?

GuardiaEUD: NO NO, de ninguna manera.

Yo: Si, si usted se pasa por mi oficina lo puede ver, es como una cajita negra con dos bombillitos. Uno de ellos siempre tiene que estar en verde.

GuardiaEUD: (escribiendo) OK, siempre en verrrrrde…

Y allí nos despedimos de el pobre guardia, sólo para cagarnos de la risa fuera del edificio y para repetir esta broma a todo el piso xxx el día siguiente.

Eso le enseñaría a no joder más con la gente de “Intelné”, que lo único que hacian era navegar :)

Sin categoría

Echando código: ¿Porqué usar BigDecimal para cálculos financieros y no Double?

Sábado, 20 de noviembre de 2004
Comentarios desactivados



La razón es simple: Java no puede representar exactamente un número como un double, asi que si es necesario (por ejemplo para matemática financiera) es mejor utilizar la clase ‘Java.math.BigDecimal’.

Si bien la clase no es perfecta (es más dificil de usar que un simple número y los cálculos som más lentos que usando números regulares) si se necesita precisición entonces es la única manera de hacerlo en Java (hay trucos trabajando con matemática entera, pero de nuevo yo pienso que estas librerías ya fueron codificadas por expertos en el área y en el futuro mejorarán su desempeño).

El libro ‘Effective Java’ (del cual ya hablé en una oportunidad) presenta ejemplos concretos de porqué no hacerlo, y este tutorial de JavaWorld es bien completo además.

Como siempre, les dejo un pequeño pedazo de código para que jueguen con él. En este caso es el cálculo del valor presente neto (NPV) en una clase ultra sencilla de Java:


import java.math.BigDecimal;

/**
* This class shows how to use the BigDecimal class for numeric
calculation that require to be exact.
* This particular class implements the formula of present value. The
correct value was calculated using the
* OpenOffice function :NPV(rate, range1, range2, ...). Only showing
the first 20 decimals.
* @author Jose Vicente Nunez Zuleta (josevnz@yahoo.com)
* @version 0.1
* @see http://www.investopedia.com/articles/03/101503.asp (check the
example here. Also the calculator shows the wrong values: 209.21, not
133.74)
* @see http://www.developer.com/java/other/article.php/631281
* @see http://www.developer.com/java/article.php/788311
*/
public final class PV {

private static BigDecimal power(BigDecimal number, int power) {
BigDecimal powerc = number;
for (int j=1; j < power; j++) {
powerc = powerc.multiply(number);
}
return powerc;
}
public static double regularNPV(double [] cashflows, double
discountRate) {
double pv = cashflows[0];
for (int i=1; i < cashflows.length; i++) {
pv += cashflows[i] / Math.pow((1 + discountRate), i);
}
return pv;
}

public static BigDecimal correctNPV(BigDecimal [] cashflows,
BigDecimal discountRate) {
BigDecimal pv = cashflows[0];
for (int i=1; i < cashflows.length; i++) {
pv = pv.add(cashflows[i].divide(power(discountRate.add(new
BigDecimal("1.0")), i), BigDecimal.ROUND_HALF_EVEN));
}
return pv;
}

public static void main(String [] args) {

// Calculation of the present value, "traditional" way
double [] cashflows = { -1000.0f, 500.0f, 400.0f, 300.0f, 200.0f,
100.0f };
double discountRate = 10.0f / 100.0f;
double pv = regularNPV(cashflows, discountRate);

BigDecimal [] cashflows2 = new BigDecimal [6];
BigDecimal discountRate2 = new BigDecimal("0.1");
cashflows2[0] = new BigDecimal("-1000.0");
cashflows2[1] = new BigDecimal("500.0");
cashflows2[2] = new BigDecimal("400.0");
cashflows2[3] = new BigDecimal("300.0");
cashflows2[4] = new BigDecimal("200.0");
cashflows2[5] = new BigDecimal("100.0");
BigDecimal pv2 = correctNPV(cashflows2, discountRate2);

System.out.println("PV Theoric: $133.74645298694200000000");
System.out.println("PV Regular: $" + pv);
System.out.println("PV Proper: $" + pv2.toString());
}
}

Sin categoría

%d personas les gusta esto: