Вопрос

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

Спасибо!

Это было полезно?

Решение

Ну есть хорошие математические библиотеки в math.h

Также хранение ваших цифр в плавании, удваивает или длинные удваивания позволят более точные операции.

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

источник

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

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

printf ("значение% 8.2f", floatvariabiable);

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

_snprintf (буфер, размер (буфер), "значение% .2f", floatvariabiable);

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

Другие советы

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

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

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

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


}

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

Трудно, потому что значительные фигуры представляют собой десятичную концепцию, а компьютеры говорят двоичные. Вы можете использовать десятичные номера классов (я ничего не знаю), или использовать Boost :: Интервал, что самое близкое к тому, что вы, безусловно, хотите достичь.

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

Вот быстрое решение 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top