【翻译】用于科学计算的 C++11/14 新特性之一
总结 C++11/14 中与科学计算相关的新特性。
【翻译】用于科学计算的 C++11/14 新特性之一
原文地址 www.numbercrunch.de
2011 年,C++ 发布了一项新标准,通常被称为 C++11。这个新标准引入了许多新的语言特性和标准库函数。这些新特性的引入旨在使 C++ 更加灵活,使用起来更加容易。Bjarne Stroustrup(C++ 的创造者)甚至认为“C++11 感觉就像一种新语言:各个部分比以往更加协调,我发现更高级的编程风格比以往更自然,效率也一如既往”。今年,C++ 的另一个新版本(C++14)已被定义,与 C++11 相比,它带来了一些微小的增强和澄清。由于 C++ 是一种通用编程语言,修订版本中的新特性并不是专门为科学计算的需求设计的。尽管如此,C++11/14 还是为计算科学家的工具箱增加了几种新工具。接下来,我将介绍其中的一些。
新的整数类型
C++ 并没有定义整数类型 int
和 long
的最小值和最大值。语言标准只规定了这些值有下限和上限。结果,int
可能是 16、32 或 64 位整数,甚至可能是其他类型。在 C++11/14 中,标准库头文件 cstdint
定义了几种具有特定位宽的整数类型。
类型 | 含义 |
---|---|
int8_t 、int16_t 、int32_t 、int64_t | 分别是宽度正好是 8、16、32 和 64 位的有符号整数类型,无填充位并对负值使用补码(仅当实现直接支持该类型时才会提供) |
int_fast8_t 、int_fast16_t 、int_fast32_t 、int_fast64_t | 分别是宽度至少有 8、16、32 和 64 位的最快的有符号整数类型 |
int_least8_t 、int_least16_t 、int_least32_t 、int_least64_t | 分别是宽度至少有 8、16、32 和 64 位的最小的有符号整数类型 |
intmax_t | 最大宽度的有符号整数类型 |
intptr_t | 保有指针的有符号整数类型 |
uint8_t 、uint16_t 、uint32_t 、uint64_t | 分别是宽度正好是 8、16、32 和 64 位的无符号整数类型(仅当实现直接支持该类型时才会提供) |
uint_fast8_t 、uint_fast16_t 、uint_fast32_t 、uint_fast64_t | 分别是宽度至少有 8、16、32 和 64 位的最快的无符号整数类型 |
uint_least8_t 、uint_least16_t 、uint_least32_t 、uint_least64_t | 分别是宽度至少有 8、16、32 和 64 位的最小的无符号整数类型 |
uintmax_t | 最大宽度的无符号整数类型 |
uintptr_t | 保有指针的无符号整数类型 |
头文件 cstdint
还定义了若干宏表示上述整数类型的最大值和最小值。然而,这些值通过模板类 std::numeric_limits
访问更方便。
译注:伪随机数和拟随机数的生成算法对整数类型的宽度有特定要求,上述新类型能使这些算法的实现更加清晰和方便移植。
数字极限
类模板 std::numeric_limits
在头文件 limits
中定义,它提供了一种标准化的方式来查询算术类型的各种属性(例如,类型 int
的最大可能值是 std::numeric_limits<int>::max
)。这些信息是通过 numeric_limits
模板的特化提供的。从 C++11 开始,std::numeric_limits
的成员被声明为 static constexpr
。因此,它们的返回值可以被用于需要常量表达式的操作,比如整数模板参数。此外,C++11 新增了 max_digits10
和 lowest
,它们分别提供了区分这种类型所有值所需的十进制数字数量,以及给定类型的最小有限值。