Pergunta

Como posso fazer matemática envolvendo números significativos em C ++? Quero que isso funcione correto com dados medidos de experimentos de química e física. Um exemplo: 65/5 = 10. Eu precisaria me livrar de casas decimais desnecessárias e substituir alguns dígitos por 0s.

Obrigado!

Foi útil?

Solução

Bem, existem Boas bibliotecas de matemática em matemática.h

Também armazenar seus números em carros alegóricos, duplas ou duplas longas permitirão operações mais precisas.

Os carros alegóricos oferecem 7 dígitos significativos, enquanto as duplas oferecem 16 dígitos significativos.

fonte

Além disso, ao imprimir, geralmente as pessoas usam _snprintf ou printf e você pode formatar essas duplas, flutuar na precisão que você deseja:

Precisão flutuante

printf ("Valor %8.2f", floatVariable);

Isso diz que você precisa de um campo total de 8 caracteres, dentro dos 8 caracteres os últimos 2 manterão a parte decimal.

_snprintf (buffer, sizeof (buffer), "value %.2f", floatVariable);

O exemplo acima solicita a largura mínima do campo e os dois últimos caracteres devem manter a parte decimal.

Outras dicas

Isso deve obter o que você precisa:

std::cout.precision(x); // x would be the number of significant figures to output

Essa pode não ser a maneira mais eficiente, mas você pode criar um tipo de dados SIG FIG personalizado.

class SigFigFloat
{
  SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
  SigFigFloat operator+(const SigFigFloat &value);
  SigFigFloat operator-(const SigFigFloat &value);
  //etc...


}

Pode ser muito trabalho, mas se você implementar esse direito, pode ser uma maneira realmente flexível de representar e fazer cálculos com o SIG Figs.

É difícil porque números significativos são um conceito decimal e os computadores falam binário. Você pode usar aulas de números decimais (não sei de nenhum) ou usar Boost :: intervalo, que é o mais próximo do que você certamente deseja alcançar.

Isso depende de como você os está exibindo. Se você estiver usando a família PrintF, você define a precisão (sprintf(buffer, "%.2f", myfloat)). Se você estiver usando ostreams, chama a função de precisão para definir o número de locais decimais. Se você está procurando o método mais científico das figs SIG, precisará escrever uma função personalizada que determine a precisão com base no valor atual do float.

Aqui está uma solução rápida C ++ 11 que funcionou para mim:

int sig_figs = 3;
double number = 1562.654478;

std::cout << "original number:" << number << std::endl;

number = ([number](int number_of_sig_figs)->double{
    std::stringstream lStream;
    lStream << std::setprecision(number_of_sig_figs) << number;
    return std::stod(lStream.str());
})(sig_figs);

std::cout << "rounded number:" << number << std::endl;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top