Skip to content

C++ 数字

C++ 提供了多种基本数据类型来表示数字,包括整型 (short, int, long, long long,可以是 signed 有符号或 unsigned 无符号) 和浮点型数字 (float, double, long double)。选择哪种类型取决于所需的范围和精度。

通过指定类型和名称来定义数值变量,初始化它们至关重要。

#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: 150
int: -50000
long long: 1234567890123
unsigned int: 400000
float: 99.95
double: 3.14159
long double: 3.141592653589793238

C++ 支持标准的算术运算符 (+, -, *, /, %)。对于更高级的数学函数,请包含 <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.374
abs(i): 1000
floor(d): -201
ceil(d): -200
sqrt(f): 15.1812
pow(5.0, 3.0): 125

在许多应用(模拟、游戏、密码学)中,生成高质量的随机数至关重要。现代 C++ 中通常不推荐使用旧的 C 风格 rand() 和 srand() 函数(来自 <cstdlib>),因为它们通常产生低质量的伪随机数且非线程安全。

<random> 头文件(C++11 引入)提供了更好的框架:

  1. 随机数引擎 (Random Number Engines): 生成伪随机位序列(例如,std::mt19937 - 梅森旋转算法,一种高质量的通用引擎)。
  2. 随机数分布 (Random Number Distributions): 将引擎输出映射到特定的统计分布(例如,均匀整数分布 std::uniform_int_distribution,均匀实数分布 std::uniform_real_distribution,正态分布 std::normal_distribution)。
  3. 种子 (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()。