我正在开发一个定点数学库。处理定点数乘法的公认方法是将它们乘以一个大于您存储的整数变量,然后根据比例因子将结果向右移动。
问题是,我已经使用 64 位整数进行存储,因此为了能够将两个值相乘,我需要访问 128 位整数。否则,我必须将每个值拆分为两个 32 位整数,然后分别将它们相乘。 (要么那样,要么用
std::bitset
做一些有创意的事情;我还没有决定。)
换句话说,我需要执行类似以下伪代码的操作:
typedef int64_t storage_t;
if (type_exits(int128_t)) {
typedef int128_t math_t;
const bool use_32_bit_algorithm = false;
} else if (type_exists(__int128)) {
typedef __int128 math_t;
const bool use_32_bit_algorithm = false;
} else {
typedef int64_t math_t;
const bool use_32_bit_algorithm = true;
}
如何实施
type_exists()
?
C++ 规定,如果实现定义了名为
std::int128_t
的类型,则 <cstdint>
必须定义相应的宏 INT128_MAX
:
当且仅当实现定义了相应的 typedef-name 时,才定义本子条款中列出的每个宏。
但是,如果非标准名称提供 128 位整数类型,则标准不施加任何要求,然后您将被简化为特定于编译器的 ifdef。 然后我会建议你让你的编译器作者通过标准接口提供他们的类型。