常用数学函数
计算自然对数(底为e)(ln(x))
std::log,
std::logf,
std::logl
定义于头文件 | ||
float logf( float arg ); | (1) | (C99 起) |
double log( double arg ); | (2) | |
long double logl( long double arg ); | (3) | (C99 起) |
定义于头文件 | ||
#define log( arg ) | (4) | (C99 起) |
1-3) 计算 arg
的自然(底 e )对数。
4) 泛型宏:若 arg
拥有 long double 类型,则调用 logl
。否则,若 arg
拥有整数类型或 double 类型,则调用 log
。否则,调用 logf
。若 arg
为复数或序数,则宏调用对应的复数函数( clogf 、 clog 、 clogl )。
参数
arg | - | 浮点值 |
返回值
若不出现错误,则返回 arg
的自然(底 e )对数( ln(arg) 或log
e(arg) )。
若出现定义域错误,则返回实现定义值(支持的平台上为 NaN )。
若出现极点错误,则返回 -HUGE_VAL
、 -HUGE_VALF
或 -HUGE_VALL
。
错误处理
报告 math_errhandling 中指定的错误。
若 arg
小于零则出现定义域错误。
若 arg
为零则可能出现极点错误。
若实现支持 IEEE 浮点算术( IEC 60559 ),则
- 若参数为 ±0 ,则返回 -∞ 并引发 FE_DIVBYZERO 。
- 若参数为 1 ,则返回 +0 。
- 若参数为负数,则返回 NaN 并引发 FE_INVALID 。
- 若参数为 +∞ ,则返回 +∞ 。
- 若参数为 NaN ,则返回 NaN 。
调用示例
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <cinttypes>
#include <cmath>
int main()
{
//计算浮点值 arg 的绝对值。
const float fNumber = 0.1314;
std::cout << "typeid(float).name(): " << typeid(float).name() << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::log(" << fNumber + i << "): "
<< std::log(fNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::log(" << -fNumber - i << "): "
<< std::log(-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 < 100; i += 10)
{
std::cout << "std::log(" << dNumber + i << "): "
<< std::log(dNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::log(" << -dNumber - i << "): "
<< std::log(-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 < 100; i += 10)
{
std::cout << "std::log(" << ldNumber + i << "): "
<< std::log(ldNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 100; i += 10)
{
std::cout << "std::log(" << -ldNumber - i << "): "
<< std::log(-ldNumber - i) << std::endl;
}
std::cout << std::endl;
return 0;
}
输出
typeid(float).name(): f
std::log(0.1314): -2.02951
std::log(10.1314): 2.31564
std::log(20.1314): 3.00228
std::log(30.1314): 3.40557
std::log(40.1314): 3.69216
std::log(50.1314): 3.91465
std::log(60.1314): 4.09653
std::log(70.1314): 4.25037
std::log(80.1314): 4.38367
std::log(90.1314): 4.50127
std::log(-0.1314): nan
std::log(-10.1314): nan
std::log(-20.1314): nan
std::log(-30.1314): nan
std::log(-40.1314): nan
std::log(-50.1314): nan
std::log(-60.1314): nan
std::log(-70.1314): nan
std::log(-80.1314): nan
std::log(-90.1314): nan
typeid(double).name(): d
std::log(0.01314): -4.33209
std::log(10.0131): 2.3039
std::log(20.0131): 2.99639
std::log(30.0131): 3.40164
std::log(40.0131): 3.68921
std::log(50.0131): 3.91229
std::log(60.0131): 4.09456
std::log(70.0131): 4.24868
std::log(80.0131): 4.38219
std::log(90.0131): 4.49996
std::log(-0.01314): nan
std::log(-10.0131): nan
std::log(-20.0131): nan
std::log(-30.0131): nan
std::log(-40.0131): nan
std::log(-50.0131): nan
std::log(-60.0131): nan
std::log(-70.0131): nan
std::log(-80.0131): nan
std::log(-90.0131): nan
typeid(long double).name(): e
std::log(0.001314): -6.63468
std::log(10.0013): 2.30272
std::log(20.0013): 2.9958
std::log(30.0013): 3.40124
std::log(40.0013): 3.68891
std::log(50.0013): 3.91205
std::log(60.0013): 4.09437
std::log(70.0013): 4.24851
std::log(80.0013): 4.38204
std::log(90.0013): 4.49982
std::log(-0.001314): nan
std::log(-10.0013): nan
std::log(-20.0013): nan
std::log(-30.0013): nan
std::log(-40.0013): nan
std::log(-50.0013): nan
std::log(-60.0013): nan
std::log(-70.0013): nan
std::log(-80.0013): nan
std::log(-90.0013): nan