Eigen c++ 将 double 转换为 long int?
Eigen c++ cast double to long int?
快速提问:
考虑从 double 到 long int 的这个(错误的)转换:
Eigen::VectorXd Price = Map<VectorXd>(price, n);
double TickFactor = 1.0 / TickSize;
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <long int> ();
给出以下错误(Eigen 3.3.5,g++ 7.3.0):
eigen/Eigen/src/Core/util/StaticAssert.h:33:40: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
现在,编译:
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <int> ();
这是我的问题。上面的行是否允许 (Price * TickFactor)
的值大于 short int
的上限? --无论当前系统上有多少,比如 33K。
这一行
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <int> ();
本质上等同于
Eigen::VectorXi IntPrice(Price.size());
for(Eigen::Index i=0; i<Price.size(); ++i)
IntPrice[i] = static_cast<int>(Price[i] * TickFactor;
除非在您的系统上 short int
和 int
相同,否则您将被限制为 int
的大小(而不是 short int
),并且溢出行为是(我认为)未定义。
如果您想要 64 位整数,请按照 ggael 的建议进行操作:
typedef Eigen::Matrix<int64_t,Dynamic,1> VectorXi64;
VectorXi64 IntPrice = (Price * TickFactor).cast<int64_t>();
快速提问:
考虑从 double 到 long int 的这个(错误的)转换:
Eigen::VectorXd Price = Map<VectorXd>(price, n);
double TickFactor = 1.0 / TickSize;
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <long int> ();
给出以下错误(Eigen 3.3.5,g++ 7.3.0):
eigen/Eigen/src/Core/util/StaticAssert.h:33:40: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
现在,编译:
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <int> ();
这是我的问题。上面的行是否允许 (Price * TickFactor)
的值大于 short int
的上限? --无论当前系统上有多少,比如 33K。
这一行
Eigen::VectorXi IntPrice = (Price * TickFactor).cast <int> ();
本质上等同于
Eigen::VectorXi IntPrice(Price.size());
for(Eigen::Index i=0; i<Price.size(); ++i)
IntPrice[i] = static_cast<int>(Price[i] * TickFactor;
除非在您的系统上 short int
和 int
相同,否则您将被限制为 int
的大小(而不是 short int
),并且溢出行为是(我认为)未定义。
如果您想要 64 位整数,请按照 ggael 的建议进行操作:
typedef Eigen::Matrix<int64_t,Dynamic,1> VectorXi64;
VectorXi64 IntPrice = (Price * TickFactor).cast<int64_t>();