常用数学函数
计算平方根 (√x)
std::sqrt,
std::sqrtf,
std::sqrtl
float sqrtf( float arg ); | (1) | (C99 起) |
double sqrt( double arg ); | (2) | |
long double sqrtl( long double arg ); | (3) | (C99 起) |
定义于头文件 | ||
#define sqrt( arg ) | (4) | (C99 起) |
1-3) 计算 arg
的平方根。
4) 泛型宏:若 arg
拥有 long double 类型,则调用 sqrtl
。否则,若 arg
拥有整数类型或 double 类型,则调用 sqrt
。否则调用 sqrtf
。若 arg
为复数或虚数,则宏调用对应复数函数( csqrtf 、 csqrt 、 csqrtl )。
参数
arg | - | 浮点值 |
返回值
若不出现错误,则返回 arg
的平方根( √arg )。
若出现定义域错误,则返回实现定义值(支持的平台上为 NaN )。
若出现下溢所致的值域错误,则返回(舍入后的)正确结果。
错误处理
报告 math_errhandling 中指定的错误。
若 arg
小于零则出现定义域错误。
若实现支持 IEEE 浮点算术( IEC 60559 ),则
- 若参数小于 -0 ,则引发 FE_INVALID 并返回 NaN 。
- 若参数为 +∞ 或 ±0 ,则返回不修改的参数。
- 若参数为 NaN ,则返回 NaN 。
注意
IEEE 标准要求 sqrt
为准确。其他要求为准确的运算只有算术运算符和函数 fma 。舍入到返回类型后(用默认舍入模式), sqrt
的结果与无限精度结果不可辨别。换言之,误差小于 0.5 ulp 。其他函数,包含 pow ,不受如此的制约。
调用示例
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <cinttypes>
#include <cmath>int main()
{//1-3) 计算 arg 的平方根。const float fNumber = 0.1314;std::cout << "typeid(float).name(): " << typeid(float).name() << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << fNumber + i << "): "<< std::sqrt(fNumber + i) << std::endl;}std::cout << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << -fNumber - i << "): "<< std::sqrt(-fNumber - i) << std::endl;}std::cout << std::endl;const double dNumber = 0.01314;std::cout << "typeid(double).name(): " << typeid(double).name() << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << dNumber + i << "): "<< std::sqrt(dNumber + i) << std::endl;}std::cout << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << -dNumber - i << "): "<< std::sqrt(-dNumber - i) << std::endl;}std::cout << std::endl;const long double ldNumber = 0.001314;std::cout << "typeid(long double).name(): " << typeid(long double).name() << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << ldNumber + i << "): "<< std::sqrt(ldNumber + i) << std::endl;}std::cout << std::endl;for (int i = 0; i < 1000; i += 100){std::cout << "std::sqrt(" << -ldNumber - i << "): "<< std::sqrt(-ldNumber - i) << std::endl;}std::cout << std::endl;return 0;
}
输出
typeid(float).name(): f
std::sqrt(0.1314): 0.362491
std::sqrt(100.131): 10.0066
std::sqrt(200.131): 14.1468
std::sqrt(300.131): 17.3243
std::sqrt(400.131): 20.0033
std::sqrt(500.131): 22.3636
std::sqrt(600.131): 24.4976
std::sqrt(700.131): 26.46
std::sqrt(800.131): 28.2866
std::sqrt(900.131): 30.0022std::sqrt(-0.1314): nan
std::sqrt(-100.131): nan
std::sqrt(-200.131): nan
std::sqrt(-300.131): nan
std::sqrt(-400.131): nan
std::sqrt(-500.131): nan
std::sqrt(-600.131): nan
std::sqrt(-700.131): nan
std::sqrt(-800.131): nan
std::sqrt(-900.131): nantypeid(double).name(): d
std::sqrt(0.01314): 0.11463
std::sqrt(100.013): 10.0007
std::sqrt(200.013): 14.1426
std::sqrt(300.013): 17.3209
std::sqrt(400.013): 20.0003
std::sqrt(500.013): 22.361
std::sqrt(600.013): 24.4952
std::sqrt(700.013): 26.4578
std::sqrt(800.013): 28.2845
std::sqrt(900.013): 30.0002std::sqrt(-0.01314): nan
std::sqrt(-100.013): nan
std::sqrt(-200.013): nan
std::sqrt(-300.013): nan
std::sqrt(-400.013): nan
std::sqrt(-500.013): nan
std::sqrt(-600.013): nan
std::sqrt(-700.013): nan
std::sqrt(-800.013): nan
std::sqrt(-900.013): nantypeid(long double).name(): e
std::sqrt(0.001314): 0.0362491
std::sqrt(100.001): 10.0001
std::sqrt(200.001): 14.1422
std::sqrt(300.001): 17.3205
std::sqrt(400.001): 20
std::sqrt(500.001): 22.3607
std::sqrt(600.001): 24.4949
std::sqrt(700.001): 26.4575
std::sqrt(800.001): 28.2843
std::sqrt(900.001): 30std::sqrt(-0.001314): nan
std::sqrt(-100.001): nan
std::sqrt(-200.001): nan
std::sqrt(-300.001): nan
std::sqrt(-400.001): nan
std::sqrt(-500.001): nan
std::sqrt(-600.001): nan
std::sqrt(-700.001): nan
std::sqrt(-800.001): nan
std::sqrt(-900.001): nan