文章

【翻译】用于科学计算的 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++ 并没有定义整数类型 intlong 的最小值和最大值。语言标准只规定了这些值有下限和上限。结果,int 可能是 16、32 或 64 位整数,甚至可能是其他类型。在 C++11/14 中,标准库头文件 cstdint 定义了几种具有特定位宽的整数类型。

类型含义
int8_tint16_tint32_tint64_t分别是宽度正好是 8、16、32 和 64 位的有符号整数类型,无填充位并对负值使用补码(仅当实现直接支持该类型时才会提供)
int_fast8_tint_fast16_tint_fast32_tint_fast64_t分别是宽度至少有 8、16、32 和 64 位的最快的有符号整数类型
int_least8_tint_least16_tint_least32_tint_least64_t分别是宽度至少有 8、16、32 和 64 位的最小的有符号整数类型
intmax_t最大宽度的有符号整数类型
intptr_t保有指针的有符号整数类型
uint8_tuint16_tuint32_tuint64_t分别是宽度正好是 8、16、32 和 64 位的无符号整数类型(仅当实现直接支持该类型时才会提供)
uint_fast8_tuint_fast16_tuint_fast32_tuint_fast64_t分别是宽度至少有 8、16、32 和 64 位的最快的无符号整数类型
uint_least8_tuint_least16_tuint_least32_tuint_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_digits10lowest,它们分别提供了区分这种类型所有值所需的十进制数字数量,以及给定类型的最小有限值。

本文由作者按照 CC BY 4.0 进行授权