Как Boost.Units придумали этот неточный результат конверсии?

Рассмотрим следующий код:

#include <boost/units/io.hpp>
#include <boost/units/systems/si/plane_angle.hpp>
#include <boost/units/systems/angle/degrees.hpp>
#include <iostream>
#include <cmath>
#include <limits>

int main()
{
using namespace boost::units;
std::cout.precision(std::numeric_limits<double>::digits10);
std::cout << "Everyone knows that 180 deg = " << std::acos(-1.) << " rad\n";
std::cout << "Boost thinks that   180 deg = "<< quantity<si::plane_angle,double>(180.*degree::degree) << "\n";
}

Я получаю следующий вывод:

Everyone knows that 180 deg = 3.14159265358979 rad
Boost thinks that   180 deg = 3.14159265359 rad

Очевидно, Boost.Units получает M_PI очень низкой точности, определенный где-то вручную, потому что он просто обрезается после 12-го десятичный место. Но как я grepпед мой /usr/include/Я нашел это неточное определение только в /usr/include/python2.7/Imaging.h, который выглядит совершенно не связанным. Все остальные имеют больше десятичных цифр.

Итак, мой вопрос: как Boost придумала этот результат?

4

Решение

От boost/units/base_units/angle/degree.hpp:

BOOST_UNITS_DEFINE_BASE_UNIT_WITH_CONVERSIONS(angle,degree,"degree","deg",6.28318530718/360.,boost::units::angle::radian_base_unit,-101);

Деление 6.28318530718 на 2 возвращает значение, которое вы видите. Это, конечно, не совсем правильно, но, увы, похоже, это так.

Обновить: Я нашел сообщение об ошибке для этой проблемы: https://svn.boost.org/trac/boost/ticket/6893

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector