C++ 数字
C++ 中的数字
Section titled “C++ 中的数字”C++ 提供了多种基本数据类型来表示数字,包括整型 (short, int, long, long long,可以是 signed 有符号或 unsigned 无符号) 和浮点型数字 (float, double, long double)。选择哪种类型取决于所需的范围和精度。
定义和初始化数字
Section titled “定义和初始化数字”通过指定类型和名称来定义数值变量,初始化它们至关重要。
#include <iostream>#include <limits> // 用于获取数值限制
int main() { // 整型 short smallNum {150}; int standardInt {-50000}; long long largeInt {1234567890123LL}; // long long 类型的 LL 后缀 unsigned int positiveOnly {400000};
// 浮点型 float price {99.95f}; // float 类型的 f 后缀 double pi {3.1415926535}; long double highPrecisionPi {3.141592653589793238L}; // long double 类型的 L 后缀
// 打印数字 std::cout << "short: " << smallNum << std::endl; std::cout << "int: " << standardInt << std::endl; std::cout << "long long: " << largeInt << std::endl; std::cout << "unsigned int: " << positiveOnly << std::endl; std::cout << "float: " << price << std::endl; std::cout << "double: " << pi << std::endl; // 如果需要,确保 long double 输出高精度 std::cout.precision(std::numeric_limits<long double>::max_digits10); std::cout << "long double: " << highPrecisionPi << std::endl;
return 0;}输出(浮点精度可能略有差异):
short: 150int: -50000long long: 1234567890123unsigned int: 400000float: 99.95double: 3.14159long double: 3.141592653589793238C++ 支持标准的算术运算符 (+, -, *, /, %)。对于更高级的数学函数,请包含 <cmath> 头文件。
常用的 <cmath> 函数:
Section titled “常用的 <cmath> 函数:”| 函数 | 描述 |
|---|---|
std::sqrt(x) | 计算 x 的平方根。 |
std::pow(base, exp) | 计算 base 的 exp 次幂。 |
std::sin(x)、std::cos(x)、std::tan(x) | 三角函数(角度 x 以弧度为单位)。 |
std::log(x) | 计算 x 的自然对数(底数为 e)。 |
std::log10(x) | 计算 x 的常用对数(底数为 10)。 |
std::abs(x) | 计算整数 x 的绝对值(来自 <cstdlib>)。 |
std::fabs(x) | 计算浮点数 x 的绝对值(来自 <cmath>)。 |
std::ceil(x) | 将 x 向上舍入到最接近的整数(返回 double)。 |
std::floor(x) | 将 x 向下舍入到最接近的整数(返回 double)。 |
std::round(x) | 将 x 舍入到最接近的整数(返回 double,C++11)。 |
std::hypot(x, y) | 计算 (x² + y²) 的平方根,避免中间过程的溢出/下溢(C++11)。 |
使用 <cmath> 的示例:
#include <iostream>#include <cmath> // 包含数学函数#include <cstdlib> // 用于 std::abs
int main() { double d = -200.374; float f = 230.47f; int i = -1000;
std::cout << "fabs(d): " << std::fabs(d) << std::endl; std::cout << "abs(i): " << std::abs(i) << std::endl; std::cout << "floor(d): " << std::floor(d) << std::endl; std::cout << "ceil(d): " << std::ceil(d) << std::endl; std::cout << "sqrt(f): " << std::sqrt(f) << std::endl; std::cout << "pow(5.0, 3.0): " << std::pow(5.0, 3.0) << std::endl;
return 0;}输出:
fabs(d): 200.374abs(i): 1000floor(d): -201ceil(d): -200sqrt(f): 15.1812pow(5.0, 3.0): 125现代 C++ 中的随机数
Section titled “现代 C++ 中的随机数”在许多应用(模拟、游戏、密码学)中,生成高质量的随机数至关重要。现代 C++ 中通常不推荐使用旧的 C 风格 rand() 和 srand() 函数(来自 <cstdlib>),因为它们通常产生低质量的伪随机数且非线程安全。
<random> 头文件(C++11 引入)提供了更好的框架:
- 随机数引擎 (Random Number Engines): 生成伪随机位序列(例如,
std::mt19937- 梅森旋转算法,一种高质量的通用引擎)。 - 随机数分布 (Random Number Distributions): 将引擎输出映射到特定的统计分布(例如,均匀整数分布
std::uniform_int_distribution,均匀实数分布std::uniform_real_distribution,正态分布std::normal_distribution)。 - 种子 (Seeding): 引擎需要被设置种子(初始化),以便每次产生不同的序列。使用
std::random_device是获取非确定性种子的常用方法。
使用 <random> 的示例:
#include <iostream>#include <random> // 包含现代随机数生成功能#include <vector>
int main() { // 1. 设置随机数引擎的种子 (最好在应用程序运行时设置一次) std::random_device rd; // 从硬件/OS 获取非确定性种子 std::mt19937 engine(rd()); // 使用 rd() 作为种子创建梅森旋转引擎
// 2. 定义分布 std::uniform_int_distribution<int> uniform_dist_int(1, 100); // 生成 1 到 100 之间的整数 (包含两端) std::uniform_real_distribution<double> uniform_dist_real(0.0, 1.0); // 生成 0.0 到 1.0 之间的双精度浮点数 (不包含 1.0) std::normal_distribution<double> normal_dist(50.0, 10.0); // 均值 Mean=50, 标准差 Standard Deviation=10
// 3. 使用引擎和分布生成随机数 std::cout << "Uniform integers (1-100):" << std::endl; for (int i = 0; i < 5; ++i) { std::cout << uniform_dist_int(engine) << " "; } std::cout << std::endl;
std::cout << "\nUniform doubles (0.0-1.0):" << std::endl; for (int i = 0; i < 5; ++i) { std::cout << uniform_dist_real(engine) << " "; } std::cout << std::endl;
std::cout << "\nNormally distributed doubles (mean=50, stddev=10):" << std::endl; for (int i = 0; i < 5; ++i) { std::cout << normal_dist(engine) << " "; } std::cout << std::endl;
return 0;}示例输出(每次运行时值会有所不同):
Uniform integers (1-100):75 15 68 91 3
Uniform doubles (0.0-1.0):0.888989 0.194441 0.686665 0.241961 0.542765
Normally distributed doubles (mean=50, stddev=10):46.5876 57.8495 39.9173 52.5858 61.5401**建议:**在 C++ 中生成随机数时,始终优先使用 <random> 库,而不是 rand()/srand()。