Números de Ponto Flutuante (XFL)
Contexto
Seção intitulada “Contexto”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:
- O formato é inerentemente decimal, expresso como uma
mantissadecimal multiplicada por10elevado à potência de umexpoente. - Todos os valores expressos têm 16 algarismos significativos (decimais).
- O intervalo de expoentes é de
-96a+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.
O que é XFL?
Seção intitulada “O que é XFL?”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 Flutuante | Número Envolvente | Representação |
|---|---|---|
| -1 | 1478180677777522688 | -1000000000000000 * 10^(-15) |
| 0 | 0 | 0 (zero canônico) |
| 1 | 6089866696204910592 | +1000000000000000 * 10^(-15) |
| PI | 6092008288858500385 | +3141592653589793 * 10^(-15) |
| -PI | 1480322270431112481 | -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.
Zero Canônico
Seção intitulada “Zero Canônico”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).
API Float de Hooks
Seção intitulada “API Float de Hooks”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 Hook | O que faz |
|---|---|
| float_set | Cria um float a partir de um expoente e mantissa |
| float_multiply | Multiplica dois números XFL |
| float_mulratio | Multiplica um XFL por um numerador e denominador não-XFL |
| float_negate | Nega um número XFL de ponto flutuante |
| float_compare | Realiza uma comparação entre dois números XFL de ponto flutuante |
| float_sum | Soma dois números XFL |
| float_sto | Gera um XFL como um objeto serializado |
| float_sto_set | Lê um valor serializado em um XFL |
| float_invert | Divide 1 por um número XFL de ponto flutuante |
| float_divide | Divide um XFL por outro número XFL de ponto flutuante |
| float_one | Retorna o número 1 representado em um número envolvente XFL |
| float_exponent | Obtém o expoente de um número envolvente XFL |
| float_mantissa | Obtém a mantissa de um número envolvente XFL |
| float_sign | Obtém o sinal de um número envolvente XFL |
| float_exponent_set | Define o expoente de um número envolvente XFL |
| float_mantissa_set | Define a mantissa de um número envolvente XFL |
| float_sign_set | Define o sinal de um número envolvente XFL |
| float_int | Converte um XFL de ponto flutuante em um inteiro (floor) |
| float_root | Calcula a n-ésima raiz de um XFL |
| float_log | Calcula o logaritmo decimal de um XFL |
Exemplo
Seção intitulada “Exemplo”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);