Otimização binária do algoritmo C/C++ de alta precisão (adição, subtração, multiplicação e divisão)

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)



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
insira a descrição da imagem aqui

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.
insira a descrição da imagem aqui


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

insira a descrição da imagem aqui


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.


Acho que você gosta

Origin blog.csdn.net/u013113678/article/details/130320216
Recomendado
Clasificación