Neslib.multiprecision adiciona dois tipos adicionais de ponto flutuante para uso com Delphi. Eles oferecem uma precisão que é 4 vezes maior que a do tipo Double .
Neslib.multiprecision está construído no topo do QD 2.3.22 e trabalha em:
Os algoritmos usados para esses tipos foram desenvolvidos por David H. Bailey, Yozo Hida e Xiaoye S. Li. Dê uma olhada no arquivo qd.pdf no subdiretório C se estiver interessado nos detalhes.
Para instalar:
> git clone https://github.com/neslib/Neslib.MultiPrecisionEsta biblioteca não tem dependências de outras bibliotecas. Também não há dependências em tempo de execução. A biblioteca C/C ++ QD subjacente está vinculada ao executável usando arquivos de objeto ou bibliotecas estáticas.
Esta biblioteca define dois tipos adicionais de ponto flutuante:
DoubleDouble : este é um tipo de 128 bits que tem o dobro da precisão do tipo Double .QuadDouble : este é um tipo de 256 bits que tem quatro vezes a precisão do tipo Double . Ambos os tipos têm o mesmo intervalo do tipo duplo (cerca de ± 10 308 ), mas muito maior precisão. Comparado a Single e Double :
| Tipo | Expoente Bits | Mantissa Bits | Precisão (dígitos decimais) |
|---|---|---|---|
| Solteiro | 9 | 24 | 7 |
| Dobro | 12 | 53 | 16 |
| Dobrado | 12 | 106 | 32 |
| Quaddouble | 12 | 212 | 64 |
Os nomes
DoubleDoubleeQuadDoublevêm da biblioteca QD subjacente. Eu pensei em nomear essesFloat128eFloat256, mas já existem especificações oficiais do IEEE para tais tipos (hardware). E como estes não são compatíveis comDoubleDoubleeQuadDouble, eu não queria adicionar confusão.
A biblioteca de QD subjacente não usa emulação para cálculos. Em vez disso, ele usa os recursos de ponto flutuante existentes da CPU para usar 2 ou 4 valores Double para aumentar a precisão. Como resultado, esses tipos são muito mais rápidos do que outras bibliotecas de matemática arbitrária/de alta precisão usando a mesma precisão. Além disso, em oposição a muitas outras bibliotecas, esses tipos não requerem alocações de memória dinâmica, o que ajuda ainda mais ao desempenho e também reduz a fragmentação da memória.
Os tipos DoubleDouble e QuadDouble podem ser usados da mesma maneira que o tipo Double . Eles suportam os operadores usuais ( + , - , * , / , = , <> , < , <= , > e >= ), bem como a maioria dos métodos disponíveis para os ajudantes de registro para o tipo Double ( IsNan , IsInfinity , IsNegativeInfinity , IsPositiveInfinity , ToString , Parse e TryParse ). Existem métodos e operadores para converter para e para Double , DoubleDouble , QuadDouble e String .
Como o idioma Delphi não permite que você insira literais de ponto flutuante de alta precisão no código-fonte, o valor de uma variável DoubleDouble ou QuadDouble deve ser inicializado de alguma outra maneira. Existem várias opções (assumindo que DD seja do tipo DoubleDouble aqui):
Init . Por exemplo, DD.Init(1.23); Para inicializar um DoubleDouble de um Double .DD := DoubleDouble(1.23); .DD := DoubleDouble.Pi; .DD := '3.1415926535897932384626433832795'; .Não adicionei operadores implícitos , como
DD := 1.23;, pois esses podem levar a conversões não intencionais que afetam o desempenho.
É importante que você chame MultiPrecisionInit antes de executar qualquer cálculo DoubleDouble / QuadDouble . Isso prepara a FPU/CPU para matemática de alta precisão. Você pode usar MultiPrecisionReset para restaurar a FPU/CPU em seu estado anterior.
A configuração padrão da biblioteca é adequada para a maioria dos aplicativos. Essa configuração sacrifica um pouco de precisão para aumentar a velocidade. Se a precisão for mais importante que a velocidade para seus propósitos, você poderá compilar a biblioteca com a definição MP_ACCURATE . Isso tornará muitos cálculos um pouco mais lentos, mas mais precisos.
A biblioteca QD subjacente (e, portanto, esta biblioteca) suporta uma variedade de funções matemáticas comuns. Além disso, a biblioteca Neslib.multiprecision adiciona numerosos equivalentes de funções encontradas no sistema.sysutils e System.Math Units.
| Nome | Descrição |
|---|---|
| Strtodoubledouble, strtoquaddouble, Strtodoubledoubledoubledef, strtoquadoubledef, Trystrtofloat | Converter da string |
| Floattostr, Floattostrf | Converter em string |
| Inverso | Calcule recíproco |
| Rem | Calcule o restante, arredondando para o mais próximo |
| Divrem | Calcule o resultado da divisão, incluindo o restante |
| Fmod | Calcule o restante, arredondado para zero |
| SQRT, SQR | Raiz quadrada e quadrado |
| Trunc, piso, teto, redondo | Vários métodos de arredondamento |
| Abs | Valor absoluto |
| Min, máx | Retornar valor mínimo ou máximo |
| INRANGE, SEGRANCERANDO | Compare com o alcance |
| Mesmo valor | Verificação aproximada da igualdade |
| Power, IntPower, Nroot, Ldexp, Exp | Funções exponenciais |
| Ln, lnxp1, log2, log10, logn | Funções logarítmicas |
| Pecado, cos, sincos, tan | Funções trigonométricas |
| Arcsin, Arccos, Arctan, Arctan2 | Funções trigonométricas inversas |
| Sinh, cosh, sincosh, tanh | Funções hiperbólicas |
| Arcsinh, ArcCosh, Arctanh | Funções hiperbólicas inversas |
| Cotan, Cot, Secant, Sec, Cosecante, CSC | Funções trigonométricas recíprocas |
| Coth, Sech, CSCH | Funções hiperbólicas recíprocas |
| Arccot, ArcSec, Arccsc | Funções trigonométricas inversas recíprocas |
| Arccoth, Arcsech, Arcccsch | Funções hiperbólicas inversas recíprocas |
| RadtodeG, radtogrado, RadTocycle | Converter de radianos |
| Degtorad, degtogrado, degtociclo | Converter de graus |
| Gradtorad, Gradtodeg, GradTocycle | Converter de graduados |
| Cycletorad, cicleto, cicletogrado | Converter de ciclos |
Uma maneira divertida de demonstrar matemática de alta precisão é calcular o fractal de Mandelbrot. À medida que você amplia o fractal, você precisa de cada vez mais precisão. O subdiretório de amostras contém um aplicativo Firemonkey que gera o fractal de Mandelbrot em 4 níveis de precisão ( Single , Double , DoubleDouble e QuadDouble ).
A imagem a seguir mostra uma pequena seção do fractal usando uma ampliação de um quadrilhão (10 15 , também conhecido como um bilhar na Europa) e precisão Double :

Você pode ver claramente que o tipo Double não fornece precisão suficiente nesse nível de ampliação. O tipo DoubleDouble oferece precisão mais do que suficiente:

Não é até você atingir um nível de ampliação de 10 31 , que você precisa mudar para QuadDouble .
Há mais para Neslib.multiprecision do que o descrito acima. Para obter mais detalhes, você pode observar o arquivo de origem Neslib.MultiPrecision.pas bem documentado. Amostras de uso adicional podem ser encontradas no subdiretório da Unittests e na aplicação da amostra Mandelbrot.
Se você estiver interessado nos detalhes técnicos e algoritmos usados para esses tipos, poderá dar uma olhada no arquivo qd.pdf no subdiretório C.
Como dito, esta biblioteca está construída no topo da biblioteca QD. Esta é uma biblioteca C/C ++ vinculada ao seu executável Delphi usando arquivos de objeto ou bibliotecas estáticas. Se você precisar ou deseja criar esses arquivos de objeto e bibliotecas estáticas, dê uma olhada no arquivo readme.txt no subdiretório C para obter instruções.
Neslib.multiprecision está licenciado sob a licença BSD simplificada. Consulte License.txt para obter detalhes.
A biblioteca de QD subjacente é licenciada sob a licença BSD-LBNL. Consulte o documento BSD-lbnl-license.doc no subdiretório C para obter detalhes.