Parte da suíte stdfrigo. Uma biblioteca que fornece constantes matemáticas fundamentais pré-calculadas com precisão máxima para formatos IEEE 754, eliminando erros de arredondamento e custos de inicialização.
Destaques:
- Precisão Máxima: Constantes geradas para preencher exatamente a mantissa de
float(24 bits) edouble(53 bits). - Tipagem Explícita: Sufixos claros (
_32parafloate_64paradouble) que evitam conversões implícitas e garantem o uso de literais imediatos. - Otimização por Inversão: Fornece versões
X_INV(1/x) para substituir divisões lentas por multiplicações rápidas em loops críticos. - Filosofia NeoLibC: Sem dependências externas, garantindo que o compilador insira os valores diretamente no binário.
Definições de alta precisão para π, τ (2\π) e suas conversões. Essenciais para física, ondas e rotações 3D.
- Exemplo:
PI_64,TAU_32,DEG2RAD_64. - Otimização: Use
RAD2DEGpara converter radianos em graus sem realizar a divisão manualmente.
Valores de raízes comuns e seus inversos multiplicativos.
- Raízes:
SQRT2(√2),SQRT3,SQRT5. - Inversos:
SQRT2_INV(1/√2), fundamental para normalização de vetores unitários.
Constantes baseadas na Proporção Áurea (ϕ⁻¹), amplamente utilizadas em algoritmos de espalhamento (Hashing) e Fibonacci.
- Uso: A constante
PHI_INV_HASH_64é a base para os mixers de alta performance dastdhash.
Números da forma 2ⁿ - 1. Em binário, consistem em uma sequência contínua de bits 1.
- Uso: Máscaras de bits (Bitmasks) e operações de módulo otimizado.
- Exemplo:
MERSENNE_31(limpa o bit de sinal emint32_t).
Substituir uma divisão por uma multiplicação é uma das otimizações mais simples e eficazes em arquiteturas modernas.
#include "stdconst.h"
// Lento: Realiza uma divisão em tempo de execução
float força = total / SQRT2_32;
// Rápido: O compilador usa um valor imediato e realiza uma multiplicação
float força_opt = total * INV_SQRT2_32;Ideal para garantir que valores permaneçam dentro de intervalos de potência de 2.
// Garante que o índice esteja entre 0 e 31 (5 bits)
uint32_t index = hash & MERSENNE_5;Para evitar qualquer ambiguidade, a biblioteca segue um padrão rígido de sufixos:
| Sufixo | Tipo C | Precisão |
|---|---|---|
_32 |
float |
24-bit mantissa (7-8 dígitos decimais) |
_64 |
double |
53-bit mantissa (15-17 dígitos decimais) |
A stdconst é puramente baseada em definições de pré-processador.
- Zero Overhead: Não ocupa espaço na memória global (seção de dados); os valores são injetados diretamente no código máquina.
- Compatibilidade: Funciona em qualquer compilador C ou C++ que suporte literais de ponto flutuante.
- Arquitetura: Pronta para sistemas embarcados e CPUs de alta performance.