Un literal numérico es una secuencia compuesta principalmente de dígitos que consta de uno o varios de los siguientes caracteres: un número entero, un punto decimal, un segmento de fracción, un indicador exponencial (“e” o “E”) y un valor exponencial que puede estar firmado. Ejemplos de números de literal:
-12
1.5362
0.875
5.56e-2
1.234E10
Es posible omitir el número entero o el segmento de fracción de un número de literal, pero no ambos. Además, dentro del segmento de fracción, es posible omitir el punto decimal o el valor exponencial, pero no ambos.
Todos los literales numéricos se convierten internamente a valores binarios de 64 bits del Institute of Electrical and Electronics Engineers (IEEE, Instituto de Ingeniería Eléctrica y Electrónica). Sin embargo, los valores de IEEE solo pueden representar una cantidad finita de números, por lo que algunos valores no tienen representación en forma de fracción binaria. Este fenómeno es similar al hecho de que algunos valores, como 1/3, no tienen una representación precisa como fracción decimal (el valor decimal necesitaría un número infinito de decimales para que fuera realmente preciso).
Estos valores que no tienen un equivalente en fracción binaria suelen ser literales numéricos con más de 16 dígitos significativos antes del exponente. FormCalc redondea estos valores al valor de IEEE de 64 bits más cercano, de acuerdo con la norma de IEEE. Por ejemplo, el valor:
123456789.012345678
se redondea al valor (más cercano):
123456789.01234567
Sin embargo, en un segundo ejemplo, el literal numérico:
99999999999999999
se redondea al valor (más cercano):
100000000000000000
Este comportamiento puede dar lugar a resultados sorprendentes. FormCalc proporciona una función, Round, que devuelve un valor dado redondeado a un número determinado de decimales. Cuando el número dado está justo a medio camino entre dos números representables, se redondea hacia el valor más alejado de cero. Es decir, el número se redondea por exceso si es positivo y por defecto si es negativo. En el ejemplo siguiente:
Round(0.124, 2)
devuelve 0.12,
y
Round(.125, 2)
devuelve 0.13.
Debido a esta norma, se podría esperar que:
Round(0.045, 2)
devuelve 0.05.
Sin embargo, la norma 754 de IEEE dictamina que el literal numérico 0.045 se aproxime a 0.0449999999999999. Esta aproximación está más cerca de 0.04 que de 0.05. Por tanto,
Round(0.045, 2)
devuelve 0.04.
Esto cumple también la norma 754 de IEEE.
Los valores de IEEE de 64 bits admiten representaciones como NaN (no es un número), +Inf (infinito positivo) e -Inf (infinito negativo). FormCalc no los admite y las expresiones cuya evaluación genera NaN, +Inf o -Inf dan como resultado una excepción de error, que se traslada al resto de la expresión.