c++ - Boost.Units 是如何得出这种不精确的转换结果的?

标签 c++ boost degrees 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 是如何得出这个结果的?

最佳答案

来自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

关于c++ - Boost.Units 是如何得出这种不精确的转换结果的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30755015/

相关文章:

c++ - 使用 boost::thread 将 const 指针参数传递给函数

c++ - c++11 中的 boost::variant 和多态性

c++ - boost::any 是可移动的吗?

C 程序不打印值

c++ - 获取蒙版纹理的 OpenGL 直方图

c++ - 如何在 android 中运行运行 C++ 应用程序?

matlab - degtorad 与 MATLAB 中的 deg2rad?

android - 旋转二维图像onclick android

c++ - 尝试将 SDL 2 与 Visual Studio c++ 一起使用

c++ - 如何将具有相同类型的不同 vector 数据成员的类对象传递给可以对任何这些数据成员进行操作的函数