C ++ значимые цифры - PullRequest
       46

C ++ значимые цифры

7 голосов
/ 05 января 2011

Как я могу сделать математику с участием значащих цифр в C ++?Я хочу, чтобы это работало корректно с измеренными данными из экспериментов по химии и физике.Пример: 65/5 = 10. Мне нужно избавиться от ненужных десятичных разрядов и заменить некоторые цифры на 0.

Спасибо!

Ответы [ 6 ]

7 голосов
/ 05 января 2011

Это должно дать вам то, что вам нужно:

std::cout.precision(x); // x would be the number of significant figures to output
4 голосов
/ 05 января 2011

Возможно, это не самый эффективный способ, но вы можете создать собственный тип данных SIG Fig.

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


}

Это может быть много работы, но если вы реализуете это право, это может быть действительно гибкий способ для представления и выполнения расчетов с помощью фиг.

1 голос
/ 05 января 2011

Это зависит от того, как вы их отображаете.Если вы используете семейство printf, вы устанавливаете точность (sprintf(buffer, "%.2f", myfloat)).Если вы используете ostreams, вы вызываете функцию точности, чтобы установить количество десятичных разрядов.Если вы ищете более научный метод, то вам нужно написать пользовательскую функцию, которая определяет точность на основе текущего значения числа с плавающей запятой.

1 голос
/ 05 января 2011

Это трудно, потому что значащие цифры - это десятичное понятие, а компьютеры говорят на двоичном языке. Вы можете использовать классы десятичных чисел (я не знаю ни одного) или использовать boost :: interval , который является наиболее близким к тому, чего вы, безусловно, хотите достичь.

0 голосов
/ 10 сентября 2014

вот быстрое решение C ++ 11, которое сработало для меня:

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;
0 голосов
/ 05 января 2011

Ну, в math.h

есть хорошие математические библиотеки.

Кроме того, хранение ваших чисел в плавающих, двойных или длинных двойных числах позволит выполнять более точные операции.

Плавающие предлагают 7 значащих цифр, в то время как двойные предлагают 16 значащих цифр.

источник

Также при печати обычно люди используют _snprintf или printf, и вы можете форматировать эти двойные числа с плавающей запятой с желаемой точностью:

Точность поплавка

printf («Значение% 8.2f», floatVariable);

Это говорит о том, что вам нужно всего поле из 8 символов, в пределах 8 символы последние 2 будут держать десятичная часть.

_snprintf (буфер, sizeof (буфер), «Значение% .2f», floatVariable);

Пример выше запрашивает минимальную ширину поля и последние два символа должны содержать десятичная часть.

...