Um número literal é uma sequência de praticamente dígitos, consistindo em um ou mais dos seguintes caracteres: um inteiro, um ponto decimal, um segmento fracional, um indicador exponente ("e" ou "E") e um valor de exponente atribuído opcionalmente. Estes são todos exemplos de números literais:
-12
1.5362
0.875
5.56e-2
1.234E10
É possível omitir o número inteiro ou o segmento de fração de um número literal, mas não ambos. Além disso, no segmento de fração, é possível omitir a vírgula decimal ou o valor de expoente, mas não ambos.
Todos os literais de número são convertidos internamente em valores binários IEEE (Institute of Electrical and Electronics Engineers) de 64 bits. Entretanto, esses valores IEEE podem representar apenas uma quantidade finita de números e, dessa forma, alguns valores não possuem uma representação como fração binária. Isso é semelhante ao fato de certos valores, como 1/3, não possuírem uma representação precisa como fração decimal (o valor decimal precisaria de um número infinito de casas decimais para ser totalmente preciso).
Os valores que não possuem um equivalente em fração binária são, geralmente, literais de número com mais de 16 dígitos significativos antes dos respectivos expoentes. FormCalc arredonda esses valores para o valor IEEE de 64 bits mais próximo que pode ser representado de acordo com o padrão IEEE. Por exemplo, o valor:
123456789.012345678
é arredondado para o valor (mais próximo):
123456789.01234567
Entretanto, em um segundo exemplo, o literal de número:
99999999999999999
é arredondado para o valor (mais próximo):
100000000000000000
Em algumas situações, esse comportamento gera resultados inesperados. FormCalc fornece uma função, Round, que retorna um determinado número arredondado para uma quantidade específica de casas decimais. Quando esse número corresponde exatamente à metade de dois números representáveis, ele é arredondado longe do zero. Ou seja, o número será arredondado para cima se for positivo e para baixo se for negativo. No exemplo a seguir:
Round(0.124, 2)
retorna 0,12
e
Round(.125, 2)
retorna 0,13.
De acordo com essa convenção, é possível esperar que:
Round(0.045, 2)
retorna 0.05.
Entretanto, o padrão IEEE 754 estabelece que o literal de número 0,045 seja aproximado para 0,0449999999999999. Essa aproximação está mais próxima de 0,04 do que de 0,05. Portanto,
Round(0.045, 2)
retorna 0.04.
Isso também está em conformidade com o padrão IEEE 754.
Valores IEEE de 64 bits oferecem suporte para representações como NaN (não é um número), +Inf (infinito positivo) e -Inf (infinito negativo). FormCalc não oferece suporte para esses valores, e uma expressão que resulta em NaN, +Inf ou -Inf gera uma exceção de erro que é transmitida para o restante dessa expressão.