Pular para o conteúdo

Números de Ponto Flutuante (XFL)

Números de ponto flutuante são amplamente usados em ciência da computação para realizar cálculos de precisão finita mas escala arbitrária.

A maioria das CPUs modernas é capaz de realizar operações de ponto flutuante rápidas usando o padrão IEEE de ponto flutuante binário, no entanto o xahaud não usa esse formato. Em vez disso, o Xahau usa um padrão de ponto flutuante decimal personalizado.

Esse formato personalizado tem três propriedades básicas:

  1. O formato é inerentemente decimal, expresso como uma mantissa decimal multiplicada por 10 elevado à potência de um expoente.
  2. Todos os valores expressos têm 16 algarismos significativos (decimais).
  3. O intervalo de expoentes é de -96 a +80

Quando serializado, a mantissa tem 54 bits e o expoente tem 8 bits, com um bit de sinal final trazendo o tamanho total do ponto flutuante serializado para 63 bits.

XLS-17d é uma proposta de padrões XRPL que define uma forma eficiente de empacotar e armazenar números de ponto flutuante do xrpld (conforme descrito acima).

Os XFLs armazenam os bits do número de ponto flutuante dentro de um número envolvente. Este é sempre um int64_t. Números envolventes negativos representam XFLs inválidos (por exemplo, como resultado de uma divisão por zero.)

Alguns exemplos de XFLs a seguir

Valor de Ponto FlutuanteNúmero EnvolventeRepresentação
-11478180677777522688-1000000000000000 * 10^(-15)
000 (zero canônico)
16089866696204910592+1000000000000000 * 10^(-15)
PI6092008288858500385+3141592653589793 * 10^(-15)
-PI1480322270431112481-3141592653589793 * 10^(-15)

Este formato é muito conveniente para Hooks, pois os Hooks só podem trocar valores inteiros com o xrpld. Ao encapsular o ponto flutuante dentro de um inteiro de forma bem definida, torna-se possível realizar computações complexas de ponto flutuante a partir de um Hook. Isso é útil para calcular taxas de câmbio.

Regimes de ponto flutuante tipicamente têm várias formas de expressar zero, o que pode ser um problema ao testar por zero. Por exemplo, 0 x 10 ^ 1 é zero e 0 x 10 ^ 2 também é zero. Por essa razão, há um zero canônico imposto pelo padrão e pela API de Hooks. O zero canônico é também o número envolvente zero (0).

Uma vez que você tem um XFL, pode usar a API Float para fazer várias computações. A API Float aparece na tabela abaixo. Cada API aceita um ou mais números envolventes XFL e retorna um número envolvente XFL. Valores de retorno negativos sempre representam um erro computacional (como divisão por zero). Não existem números envolventes negativos válidos.

API de HookO que faz
float_setCria um float a partir de um expoente e mantissa
float_multiplyMultiplica dois números XFL
float_mulratioMultiplica um XFL por um numerador e denominador não-XFL
float_negateNega um número XFL de ponto flutuante
float_compareRealiza uma comparação entre dois números XFL de ponto flutuante
float_sumSoma dois números XFL
float_stoGera um XFL como um objeto serializado
float_sto_setLê um valor serializado em um XFL
float_invertDivide 1 por um número XFL de ponto flutuante
float_divideDivide um XFL por outro número XFL de ponto flutuante
float_oneRetorna o número 1 representado em um número envolvente XFL
float_exponentObtém o expoente de um número envolvente XFL
float_mantissaObtém a mantissa de um número envolvente XFL
float_signObtém o sinal de um número envolvente XFL
float_exponent_setDefine o expoente de um número envolvente XFL
float_mantissa_setDefine a mantissa de um número envolvente XFL
float_sign_setDefine o sinal de um número envolvente XFL
float_intConverte um XFL de ponto flutuante em um inteiro (floor)
float_rootCalcula a n-ésima raiz de um XFL
float_logCalcula o logaritmo decimal de um XFL

No exemplo abaixo, uma conversão de taxa de câmbio é realizada, seguida por uma multiplicação de fração de alta precisão.

int64_t max_vault_pusd =
float_multiply(vault_xrp, exchange_rate);
max_vault_pusd =
float_mulratio(max_vault_pusd, 0,
NEW_COLLATERALIZATION_NUMERATOR, NEW_COLLATERALIZATION_DENOMINATOR);