Eigen c ++ приведение двойного к длинному int? - PullRequest
0 голосов
/ 23 ноября 2018

Быстрый вопрос:

рассмотрите это (неправильное) приведение от двойного к длинному целому:

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.

1 Ответ

0 голосов
/ 27 ноября 2018

Эта строка

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>();
...