C++11标准模板(STL)- 常用数学函数 - 计算平方根 (√x)(std::sqrt, std::sqrtf, std::sqrtl)

常用数学函数

计算平方根 (√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 起)

定义于头文件 <tgmath.h>

#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.0022

std::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):   nan

typeid(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.0002

std::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):   nan

typeid(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):   30

std::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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值