在 C 语言里面指数表示分成两大类,一类是源代码里面写常量的时候使用科学计数法字面量,另一类是做幂运算也就是 a 的 n 次方,需要调用数学库里面的 pow 函数,很多初学者容易把这两种概念弄混,科学计数法只是数字的书写形式,pow 才是真正计算乘方指数运算。之所以要区分开,是因为 C 语言本身没有内置乘方运算符,不能像部分其他语言那样直接写两个星号代表指数,直接写 ab 编译器会报错,幂运算必须引入 math.h 头文件,调用 pow 函数,并且编译的时候很多环境还需要链接数学库,这是最容易踩坑的地方。
科学计数法字面量表示指数
这种写法是直接在代码里面写带指数的浮点数常量,格式是数字部分加上 e 或者 E,后面跟整数指数,含义就是数字部分乘以 10 的指数次方,支持正指数和负指数,适合写很大或者很小的小数常量,属于浮点数常量本身的书写语法,不需要调用任何函数。
书写规则
第一 e 前面必须有有效数字,不能单独写 e10
第二 e 后面的指数必须是整数,可以带正负号
第三 这种常量默认类型是 double,如果需要 float 类型可以后面加 f 后缀
示例
double a = 1.5e3 等价于 1500
double b = 2.8e-2 等价于 0.028
pow 函数实现指数幂运算
pow 函数作用是计算 x 的 y 次方,也就是 x 的 y 次指数运算,函数原型是 double pow (double x, double y),返回值类型是 double,使用之前必须包含头文件 math.h,传入两个参数,第一个是底数,第二个是指数。
基础代码示例
include
include
int main ()
{
double base = 2;
double exp = 5;
double res = pow (base, exp);
printf ("结果是 % f\n", res);
return 0;
}
补充说明,gcc 编译这个代码的时候,经常需要加上 lm 参数链接数学库,也就是 gcc 文件名.c -lm,如果不加这个参数,会出现 pow 函数未定义的链接错误,这个是 Linux 环境高频问题,Windows 的 VS 开发环境一般不需要手动加这个参数。
特殊指数运算补充
如果指数是整数,尤其是正整数,也可以自己写循环累乘实现乘方,这种方式不依赖 math 库,不需要链接数学库,还能避免 pow 函数本身浮点数带来的精度误差,比如计算整数的整数次方,循环累乘的结果会更准确。
如果需要自然常数 e 的指数,也就是 e 的 x 次方,math 库提供专门函数 exp 函数,exp (x) 专门计算 e 的 x 次指数,比 pow (exp (1),x) 性能和精度更好。
还有 sqrt 函数是开平方,本质就是指数为 0.5 的特殊幂运算,属于 math 库内置的专用函数。
两种指数表示方式对比表格
| 类型 | 名称 | 用途 | 是否需要 math.h | 特点 |
|---|---|---|---|---|
| e E 写法 | 科学计数法字面量 | 写浮点数常量 | 不需要 | 只是数字书写形式,不是运算 |
| pow 函数 | 通用幂运算 | 任意底数任意指数乘方 | 需要 | 支持小数指数,存在浮点舍入误差 |
| exp 函数 | 自然指数 | 计算 e 的 x 次方 | 需要 | 专门针对自然底数,精度更好 |
| 循环累乘 | 自定义整数乘方 | 整数正指数运算 | 不需要 | 无浮点误差,不依赖数学库 |
深度注意要点
第一 pow 函数精度问题,pow 底层是浮点近似计算,当底数和指数都是整数的时候,偶尔会出现本该是整数的结果变成类似 7.9999999 这种数值,强制转 int 的时候就会少 1,所以整数幂运算优先考虑循环累乘。
第二 底数为负数同时指数是小数的时候,pow 运算没有实数解,函数会返回 NaN 也就是非数字,程序需要增加判断处理这种非法情况。
第三 数据类型,pow 返回值固定是 double,如果想要保存成 int,必须手动强制类型转换,并且要考虑溢出,当乘方结果超过 int 存储上限,数值会溢出变成错误结果,这种场景建议改用 long long 类型保存。
第四 大小写,科学计数法里面 e 和 E 效果完全一样,但是 long double 对应的科学计数法,还有其他数学函数大小写不能混淆,pow 全部是小写。
【常见问题】
问题 1 c 语言指数怎么表示能不能直接用两个星号做乘方
回答 1 c 语言指数怎么表示不能直接使用两个星号做乘方运算,C 语言语法没有 这个指数运算符,想要做乘方指数运算,必须调用 math 库里面的 pow 函数,或者自己写循环累乘实现指数计算。
问题 2 c 语言指数怎么表示科学计数法里面 e 和 E 有区别吗
回答 2 c 语言指数怎么表示,科学计数法里面小写 e 和大写 E 没有功能区别,都代表乘以 10 的指数次方,写代码的时候任选其一即可,一般习惯统一使用小写 e 保持代码风格一致。
问题 3 c 语言指数怎么表示 pow 编译报错未定义是什么原因
回答 3 c 语言指数怎么表示,调用 pow 出现未定义报错,一般是 Linux gcc 环境没有链接数学库,编译命令需要追加 lm 参数,同时确认代码已经引入 math.h 头文件,两个条件缺一不可。
问题 4 c 语言指数怎么表示自然常数 e 的指数有没有专用函数
回答 4 c 语言指数怎么表示,自然常数 e 的指数不需要用 pow 写 pow (2.71828,x),math 库里面 exp 函数就是专门计算 e 的 x 次指数,精度和运算效率都更高,是推荐写法。
【免责申明】
本文代码属于 C 语言教学演示,仅用于学习练习,pow 函数浮点近似计算存在固有舍入误差,不同编译器对数学库实现存在差异,极端底数和指数组合会出现非法运算结果,实际工程开发请自行增加边界判断和溢出保护,本文不保证所有极端场景运算结果完全准确。


