文章目录
一、数字
在c++中,数字可以以不同的数据类型来表示,这些数据类型决定了数字的大小、范围以及它们能表示的精确度。c++中的数字类型主要分为两大类:整型(integer)和浮点型(floating-point)。

1. 整型(integer)
整型用于表示没有小数部分的数字。c++提供了多种整型数据类型,以满足不同的存储需求。主要的整型包括:
int:最基本的整型,大小通常为4字节(32位),能够表示的数值范围依赖于编译器和平台。short:短整型,大小通常为2字节(16位)。long:长整型,大小至少为4字节(32位),但可能在某些平台上更大(如64位)。long long:长长整型,大小至少为8字节(64位)。char:字符型,通常用于存储字符,但也可以存储小整数(通常是-128到127或0到255,取决于系统是有符号还是无符号的)。unsigned:无符号类型,可以与上述任何整型结合使用(如unsigned int、unsigned short等),以表示非负整数,范围是从0到该类型能表示的最大值。
2. 浮点型(floating-point)
浮点型用于表示有小数部分的数字。c++中的浮点型主要分为两种:
float:单精度浮点型,通常占用4字节(32位)。double:双精度浮点型,通常占用8字节(64位),是float的两倍精度。long double:扩展精度浮点型,其大小至少与double相同,但可能更大,具体取决于编译器和平台。
示例
#include <iostream>
int main() {
int myint = 10; // 整型
float myfloat = 3.14f; // 浮点型,注意末尾的'f'表明这是一个float类型的字面量
double mydouble = 3.141592653589793; // 双精度浮点型
std::cout << "integer: " << myint << std::endl;
std::cout << "float: " << myfloat << std::endl;
std::cout << "double: " << mydouble << std::endl;
return 0;
}
注意事项
- 在处理大数字或需要高精度的场合时,应当选择合适的整型或浮点型数据类型。
- 浮点型数据在进行数学运算时可能会产生精度误差,因为它们在计算机中是以近似值的形式表示的。
- 在声明变量时,明确指定变量的类型是一个好习惯,这有助于编译器进行类型检查,避免潜在的错误。
二、数字运算
在c++中,数学运算主要通过运算符和数学库函数来执行。c++标准库中的<cmath>(或在c中对应的<math.h>)提供了大量的数学函数,用于执行各种复杂的数学计算,如三角函数、对数、指数、幂运算、平方根等。
1. 基本数学运算符
c++中的基本数学运算符包括:
+加法-减法*乘法/除法%求余(仅限整数)
2. 使用<cmath>库
要使用<cmath>库中的函数,你需要在程序顶部包含该头文件。然后,你就可以使用诸如sqrt(), pow(), sin(), cos(), tan(), log(), exp()等函数了。
下面是一些使用<cmath>库中函数的例子:
#include <iostream>
#include <cmath> // 包含数学库
int main() {
double num = 9.0;
double root = sqrt(num); // 计算平方根
std::cout << "the square root of " << num << " is " << root << std::endl;
double base = 2.0;
double exponent = 3.0;
double result = pow(base, exponent); // 计算幂
std::cout << base << " raised to the power of " << exponent << " is " << result << std::endl;
double angleradians = m_pi / 4.0; // 使用m_pi,它是<cmath>中定义的π的值
double sine = sin(angleradians); // 计算正弦值
std::cout << "the sine of " << angleradians << " radians is " << sine << std::endl;
return 0;
}
注意事项
- 当使用
<cmath>库中的函数时,请确保你的编译器支持这些函数。大多数现代c++编译器都支持。 - 一些函数(如
sqrt(),log(),sin()等)的参数和返回值通常是double类型,但你也可以使用它们的变体来处理float和long double类型的数据。例如,sqrtf()和sqrtl()分别用于float和long double类型。 - 在使用角度进行计算时,请注意大多数数学函数(如三角函数)默认使用弧度作为输入。如果你有一个以度为单位的角度,你需要先将其转换为弧度(弧度 = 度 * π / 180)。
- 对于整数除法,结果也会是整数。如果你需要小数结果,请确保至少有一个操作数是浮点数。
c++通过提供丰富的数学运算符和函数库,使得执行各种数学运算变得既简单又高效。
三、内置函数
| 序号 | 函数 & 描述 |
|---|---|
| 1 | double cos(double);该函数返回弧度角(double 型)的余弦。 |
| 2 | double sin(double);该函数返回弧度角(double 型)的正弦。 |
| 3 | double tan(double);该函数返回弧度角(double 型)的正切。 |
| 4 | double log(double);该函数返回参数的自然对数。 |
| 5 | double pow(double, double);假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。 |
| 6 | double hypot(double, double);该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。 |
| 7 | double sqrt(double);该函数返回参数的平方根。 |
| 8 | int abs(int);该函数返回整数的绝对值。 |
| 9 | double fabs(double);该函数返回任意一个浮点数的绝对值。 |
| 10 | double floor(double);该函数返回一个小于或等于传入参数的最大整数。 |
四、随机数
在c++中,生成随机数可以通过多种方式实现,但最常用的方法是利用标准库中的<random>头文件。这个头文件提供了比旧式c的rand()函数更强大、更灵活的随机数生成功能。
<random>库包括多种随机数引擎和分布,你可以组合使用它们来生成符合特定分布的随机数。
1. 使用<random>库生成随机数
以下是一个简单的示例,展示了如何使用<random>库生成一定范围内的随机整数:
#include <iostream>
#include <random>
int main() {
// 创建一个随机数引擎,这里使用的是默认的随机数引擎,也可以指定其他引擎
std::random_device rd; // 用于获取随机种子
std::mt19937 gen(rd()); // 以 rd() 作为种子初始化 mersenne twister 生成器
// 定义随机数分布范围,这里生成的是 [1, 100] 之间的整数
std::uniform_int_distribution<> dis(1, 100);
// 生成并打印10个随机数
for (int n = 0; n < 10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << '\n';
return 0;
}
2. 解析
-
随机数引擎:
std::mt19937是一个基于mersenne twister算法的伪随机数生成器,它以一个无符号整数(种子)作为初始化参数。为了获得尽可能随机的结果,通常使用std::random_device来生成种子,因为它能够产生非确定性的随机数。 -
随机数分布:
std::uniform_int_distribution<>是一个分布,用于生成在指定范围内的均匀分布的整数。在这个例子中,我们生成的是1到100之间的整数。 -
生成随机数:通过调用分布对象(
dis)并将随机数引擎(gen)作为参数传递给它,我们可以生成一个随机数。这个操作在循环中重复进行,以生成多个随机数。
注意
<random>库提供的随机数生成器比rand()函数更加灵活和强大,能够生成符合特定分布的随机数,并且支持自定义随机数生成算法。- 在多线程程序中,如果多个线程需要生成随机数,应该为每个线程提供独立的随机数引擎实例,以避免潜在的竞争条件和数据不一致问题。
std::random_device在某些平台上可能只是简单地返回一个常量值作为“随机”种子,因此如果你需要高度随机的种子,可能需要考虑其他方法(例如从系统时间、硬件标识符等派生)。然而,在大多数情况下,使用std::random_device作为种子已经足够好了。

发表评论