Исключение FPU при преобразовании float в int32_t - PullRequest
0 голосов
/ 29 апреля 2020

У меня, казалось бы, простая цель: я хочу преобразовать число с плавающей точкой в ​​целочисленный тип, который имеет ширину ровно 32 бита. Код, который я публикую, работает на моем компьютере windows, но не на устройстве Linux, которое я пытаюсь запустить в конце. Я попробовал это сначала:

float a;
a = /*some real number, for example 1.08825e+11*/;
if (!isfinite(a)){
 return -1;
}
int32_t b;
b = static_cast<int32_t> (a);

, который не работает - программы просто аварийно завершают работу с этой информацией в командном окне:

Время выполнения получено SIGFPE (адрес: 0xb62cd3b7 причина: недопустимая операция с плавающей точкой)

Затем я обнаружил функцию в другом вопросе о переполнении стека, которое безопасно конвертирует float в типы int-data и попытался принять функцию для мои потребности. Это моя версия:

template <class FloatType>
int32_t safeFloatToDINT(const FloatType& num) {
    //check if float fits into int32_t
    if (std::numeric_limits<int32_t>::digits < std::numeric_limits<FloatType>::digits) {
        // check if float is smaller than max int32_t
        if ((num < static_cast<FloatType>(std::numeric_limits<int32_t>::max())) &&
            (num > static_cast<FloatType>(std::numeric_limits<int32_t>::min()))) {
            return static_cast<int32_t>(num); //safe to cast
        }
        else {
            std::cerr << "Unsafe conversion of value:" << num << std::endl;
            //NaN is not defined for int32_t return the largest int32_t value
            return std::numeric_limits<int32_t>::max();
        }
    }
    else {
        //It is safe to cast
        return static_cast<int32_t>(num);
    }
}

К сожалению, b = safeFloatToDINT(a); также вызывает исключение FPU. Я также только что попытался написать b = (int32_t)a;, но это тоже не работает. Я хотел бы знать, как я могу взять мою переменную с плавающей точкой и безопасно преобразовать ее в целочисленный тип, который охватывает 32 бита. Заранее спасибо.

...