Cuando Double.MaxValue, no es Double.MaxValue

Creo que es uno de los primeros post que voy a escribir por absoluta desesperación. Y el título lo dice todo.

Estamos desarrollando una aplicación en mi empresa, donde usamos un librería «open source» construida de manera intachable. Bien estructurada, con sus clases, con sus interfaces, y todo en NET 2.0.

Ahora viene lo bueno, dentro de la librería, hay un:

public const double Missing = Double.MaxValue;

Esta línea, parece encarnar el mal, y tiene el número #630 dentro del sistema de bugtracking del proyecto (a partir de ahora el número del mal). En ciertos equipos (si, en ciertos, sin diferenciación mayor que ser otro equipo), provoca que el programa se salga (mejor dicho: explote), sin generar ninguna excepción (lo que implica un error por debajo incluso del NET) y sin dejar ningún registro de error. En cambio, si ponemos:

Si hacemos una asignación quitando el alias:

public const double Missing = 1.7976931348623157E+308;

Tenemos otro crash silencioso al ejecutar el programa. Incluso rebajando el exponente, tenemos el mismo fallo. Pero esperen, que viene lo mejor:

public const double Missing = 999999999999999999;

Entonces, todo el felicidad, los pájaros cantan y las nubes se levantan… No falla.

¿¿¿Porqué???. De verdad que no lo entiendo, y los oscuros mundos del NET me tienen frito.

Pues no termino de entender el porque. Puedo conjeturar que viene por la representación que le da .NET, no es representable por algún nivel más bajo de la máquina, o algún redondeo que implique un overflow. Pero la verdad que no he encontrado nada por la red, y menos aun por los foros de la librería. Pueden ser muchos factores, y me estaré dejando muchos sin tener en cuenta, pero desde luego ahora mismo estoy falto de ideas.

Please follow and like us:

3 pensamientos en “Cuando Double.MaxValue, no es Double.MaxValue

  1. Pingback: Bitacoras.com

  2. Hola,

    no creo que te aporte mucho porque yo soy javero/linuxero, pero puede ser porque la máquina es de 32 bits y hay algún overflow?. Has probado con 64 bits?. Pasa en la máquina de desarrollo y también en producción?. La arquitectura de ambas máquinas es similar?.

    No sé, tiene pinta de que el MaxValue no lo está cogiendo bien y por eso peta, pero claro, ya conocemos a Microsoft, actualiza a .net 3.5 o incluso 4.0 que a lo mejor no pasa :-P.

    Saludos, Iván.

    • Hola Ivan.

      Pues es muy gracioso, ya que NET siempre trabaja con registros de 64 bits, pero parece ser que hay algo que provoca una excepción a muy bajo nivel (de sistema operativo), cuando se vuelca este valor a un registro (cuando se usa realmente).

      En la maquina de desarrollo, no hay problema, pero no en todas. En la de un compañero, que fue donde depuramos el error, si daba y sigue dando… pero sólo en mi proyecto (el la usa en otro proyecto independiente y le funciona bien), lo cual es todavía mas desconcertante, ya que usamos la librería en binario (inicialmente claro, ahora nos hemos metido con el codigo fuente), por lo que es «teoricamente» el mismo escenario pero tenemos resultado diferentes.

      De verdad que daba mi huevo derecho por volver al C con gcc xDDDDD

Responder a Iván Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *