Boost.Units 是如何得出这种不精确的转换结果的?
How does Boost.Units come up with this imprecise result of conversion?
考虑以下代码:
#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 是如何得出这个结果的?
来自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 returns 您看到的值。这看起来当然不太对,但是,唉,似乎就是这样。
更新:我发现了这个问题的错误报告:https://svn.boost.org/trac/boost/ticket/6893
考虑以下代码:
#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 是如何得出这个结果的?
来自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 returns 您看到的值。这看起来当然不太对,但是,唉,似乎就是这样。
更新:我发现了这个问题的错误报告:https://svn.boost.org/trac/boost/ticket/6893