Série de Algoritmos de Precisão Avançada
Capítulo 1 Implementação Simples
Capítulo 2 Otimização de Compressão
Capítulo 3 Otimização Binária (este capítulo)
Diretório de artigos
prefácio
O capítulo anterior "Otimização de compactação de algoritmo de alta precisão (adição, subtração, multiplicação e divisão) C/C++" realizou cálculos otimizados de alta precisão. Cada elemento de uma matriz inteira usando int32 pode armazenar 9 números decimais. Desejo otimizar ainda mais o cálculo A velocidade pode alterar o método de armazenamento de dados e usar números de armazenamento binários. A matriz int32 ainda é usada para armazenar números em binário, que não apenas possui alta eficiência de computação, mas também atinge a maior utilização de espaço.
1. Princípios básicos
1. Método de armazenamento
A ordem binária de armazenamento é armazenada de baixo para cima
2. Método de cálculo
O método de cálculo é basicamente o mesmo que o método de cálculo de armazenamento decimal. O método de cálculo de int8 é dado abaixo, int16, int32 e assim por diante são essencialmente os mesmos.
2. Realização chave
1. Inteiro para array de alta precisão (binário)
Pode ser realizado por operação de bit (tipo de elemento int32 como exemplo):
/// <summary>
/// 通过无符号整型初始化
/// </summary>
/// <param name="a">[in]高精度数组</param>
/// <param name="value">[in]整型值</param>
static void loadInt(int* a, uint64_t value) {
a[1] = (uint32_t)value;
a[2] = value >> (sizeof(int) * 8);
a[0] = a[2] ? 2 : 1;
}
2. String para array de alta precisão (binário)
Um método é fornecido aqui, que precisa primeiro realizar adição e multiplicação de alta precisão.
(1) Inicialize o valor da matriz de alta precisão como 0
(2) Obtenha os números na string um por um
(3) Multiplique a matriz de alta precisão para igualar 10
(4) Adicione o número obtido à matriz de alta precisão ( consulte o acima para número inteiro para seção de matriz de alta precisão)
(5) A string não foi lida e retorna para (2)
3. Converter array de alta precisão (binário) em string
Aqui está um método, que precisa da implementação do capítulo anterior como um auxiliar "C/C++ de alta precisão (adição, subtração, multiplicação e divisão) Otimização de compressão de algoritmo" (
1) Inicialize o valor da matriz de alto progresso de 9 bits como 0
( 2) Adquira alta precisão um por um O elemento da matriz (binário)
(3) multiplicado pela matriz de alto progresso de 9 bits é igual a 2^32 (tipo de elemento da matriz binária int32 é um exemplo)
(4) O elemento adquirido é adicionado à matriz de alto progresso de 9 bits
(5) O elemento não é lido Depois de levá-lo de volta para (2)
(6) Pressione a matriz de alto progresso de 9 dígitos para converter a string
3. Código completo
Como a interface e o uso são completamente consistentes com o primeiro capítulo "Implementação simples do algoritmo C/C++ de alta precisão (adição, subtração, multiplicação e divisão)" , portanto, apenas o código completo é fornecido aqui, consulte o primeiro capítulo para obter exemplos de uso . Algoritmo de alta precisão baseado
em armazenamento binário de matriz int32 :
https://download.csdn.net/download/u013113678/87720242
4. Comparação de desempenho
Plataforma de teste: Windows 11
Equipamento de teste: i7 8750h
Método de teste: Pegue o valor médio de 5 testes
Tabela 1, casos de teste
caso de teste | descrever |
---|---|
1 | Cálculo digital de faixa inteira 500.000 vezes |
2 | Números longos e números de intervalo inteiro são calculados 500.000 vezes |
3 | Números longos e números longos calculados 500.000 vezes |
Escreva um programa baseado nos casos de uso acima para teste, os resultados do teste são mostrados na tabela a seguir Tabela
2, resultados do teste
calcular | caso de teste | A compactação da otimização de 9 bits (capítulo anterior) é demorada | Binário otimizado int32 (este capítulo) demorado |
---|---|---|---|
Adição | caso de teste 1 | 0,002620s | 0,0024862s |
Adição | caso de teste 2 | 0,005711s | 0,0034712s |
Adição | Caso de teste 3 | 0,005384s | 0,003857s |
acumular | caso de teste 1 | 0,002536s | 0,0027246s |
acumular | caso de teste 2 | 0,002592s | 0,0029876s |
acumular | Caso de teste 3 | 0,006474s | 0,0043758s |
subtração | caso de teste 1 | 0,002078s | 0,0022704s |
subtração | caso de teste 2 | 0,004939s | 0,0032914s |
subtração | Caso de teste 3 | 0,004929s | 0,0041246s |
acumulativo | caso de teste 1 | 0,002034s | 0,0020808s |
acumulativo | caso de teste 2 | 0,001942s | 0,0023542s |
acumulativo | Caso de teste 3 | 0,004282s | 0,0044144s |
multiplicação | caso de teste 1 | 0,004751s | 0,0038996s |
multiplicação | caso de teste 2 | 0,028358s | 0,0117986s |
multiplicação | Caso de teste 3 | 0,064259s | 0,0185958s |
multiplicação | O caso de teste 1 calcula apenas 1000 vezes | 0,000137s | 0,000062s |
multiplicação | O caso de teste 2 calcula apenas 1000 vezes | 0,000187s | 0,0000816s |
multiplicação | O caso de teste 3 calcula apenas 1000 vezes | 0,081988s | 0,0292832s |
divisão | caso de teste 1 | 0,024763s | 0,0196498s |
divisão | caso de teste 2 | 0,516090s | 0,3556564s |
divisão | Caso de teste 3 | 0,073812s | 0,1716874s |
divisão cumulativa | O caso de teste 1 calcula apenas 1000 vezes | 0,035722s | 0,0009416s |
divisão cumulativa | O caso de teste 2 calcula apenas 1000 vezes | 0,060936s | 0,0131722s |
divisão cumulativa | O caso de teste 3 calcula apenas 500 vezes | 25.126072s | 2.6210544s |
Classifique os dados da tabela acima no mesmo tipo e tome o valor médio para calcular a velocidade de melhoria, conforme mostrado na figura abaixo, que é apenas para referência.
Figura 1. Melhoria de velocidade
Resumir
Vou falar sobre o que foi dito acima hoje. A otimização de armazenamento binário melhorou a velocidade em comparação com a otimização de 9 bits, e o método de armazenamento é o mesmo que inteiro, o que faz bom uso do espaço. Comparado com o algoritmo de 9 bits compactado, o algoritmo binário tem uma melhoria maior na multiplicação e divisão, especialmente a melhoria das operações de dados longos é mais óbvia. A implementação do método de conversão binária do algoritmo deste capítulo refere-se ao BigInt de c#, de modo geral, trata-se de um algoritmo de alta precisão e melhor desempenho, mais adequado para o desenvolvimento de projetos.