c++ - 将浮点数转换为 int32_t 时出现 FPU 异常
问题描述
我有一个看似简单的目标:我想将浮点数转换为正好 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 原因:浮点无效操作)
然后我在另一个关于堆栈溢出的问题中找到了一个函数,它可以安全地将浮点数转换为 int 数据类型,并尝试采用该函数来满足我的需要。这是我的版本:
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 位的整数类型。先感谢您。
解决方案
推荐阅读
- python - 如何在情节人物周围放置一个白框
- spring-data-cassandra - 通过以时间戳作为聚类列的复合键查询
- javascript - 如何从选择器中获取所有选项值并生成模式数组字符串
- asp.net - IIS 8 上的 Blazor WebAssembly - 0x8007000d
- apache-spark - 计算格式为 yyyyMM 的两个日期之间月差的最佳方法是什么。在 pyspark 中?
- c# - 在客户端请求的 TCP/IP 协议中添加帧字节(开始和结束)
- python - 找到序列的开始和结束索引的有效方法?
- angular-elements - Angular Elements - 它们是 NRWL/NX 中的库还是应用程序?
- python - 在 Windows 上安装 SQL Server 2019 后,Windows 控制台无法使用 pip 安装 Python 包
- r - 在 R 中按子组分箱