常用数学函数
计算底为2的对数 (log2(x))
std::log2,
std::log2f,
std::log2l
定义于头文件 | ||
float log2f( float arg ); | (1) | (C99 起) |
double log2( double arg ); | (2) | (C99 起) |
long double log2l( long double arg ); | (3) | (C99 起) |
定义于头文件 | ||
#define log2( arg ) | (4) | (C99 起) |
1-3) 计算 arg
的底 2 对数。
4) 泛型宏:若 arg
拥有 long double 类型,则调用 log2l
。否则,若 arg
拥有整数类型或 double 类型,则调用 log2
。否则调用 log2f
。
参数
arg | - | 浮点值 |
返回值
若不出现错误,则返回 arg
的底 2 对数( log
2(arg) 或 lb(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 。
注意
对于整数 arg
,二进制对数能转译成输入中最高位 1 的零底下标。
调用示例
#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 < 1000; i += 100)
{
std::cout << "std::log2(" << fNumber + i << "): "
<< std::log2(fNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 1000; i += 100)
{
std::cout << "std::log2(" << -fNumber - i << "): "
<< std::log2(-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::log2(" << dNumber + i << "): "
<< std::log2(dNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 1000; i += 100)
{
std::cout << "std::log2(" << -dNumber - i << "): "
<< std::log2(-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::log2(" << ldNumber + i << "): "
<< std::log2(ldNumber + i) << std::endl;
}
std::cout << std::endl;
for (int i = 0; i < 1000; i += 100)
{
std::cout << "std::log2(" << -ldNumber - i << "): "
<< std::log2(-ldNumber - i) << std::endl;
}
std::cout << std::endl;
return 0;
}
输出
typeid(float).name(): f
std::log2(0.1314): -2.92796
std::log2(100.131): 6.64575
std::log2(200.131): 7.6448
std::log2(300.131): 8.22945
std::log2(400.131): 8.64433
std::log2(500.131): 8.96616
std::log2(600.131): 9.22913
std::log2(700.131): 9.45148
std::log2(800.131): 9.64409
std::log2(900.131): 9.81399
std::log2(-0.1314): nan
std::log2(-100.131): nan
std::log2(-200.131): nan
std::log2(-300.131): nan
std::log2(-400.131): nan
std::log2(-500.131): nan
std::log2(-600.131): nan
std::log2(-700.131): nan
std::log2(-800.131): nan
std::log2(-900.131): nan
typeid(double).name(): d
std::log2(0.01314): -6.24989
std::log2(100.013): 6.64405
std::log2(200.013): 7.64395
std::log2(300.013): 8.22888
std::log2(400.013): 8.6439
std::log2(500.013): 8.96582
std::log2(600.013): 9.22885
std::log2(700.013): 9.45124
std::log2(800.013): 9.64388
std::log2(900.013): 9.8138
std::log2(-0.01314): nan
std::log2(-100.013): nan
std::log2(-200.013): nan
std::log2(-300.013): nan
std::log2(-400.013): nan
std::log2(-500.013): nan
std::log2(-600.013): nan
std::log2(-700.013): nan
std::log2(-800.013): nan
std::log2(-900.013): nan
typeid(long double).name(): e
std::log2(0.001314): -9.57182
std::log2(100.001): 6.64388
std::log2(200.001): 7.64387
std::log2(300.001): 8.22883
std::log2(400.001): 8.64386
std::log2(500.001): 8.96579
std::log2(600.001): 9.22882
std::log2(700.001): 9.45121
std::log2(800.001): 9.64386
std::log2(900.001): 9.81378
std::log2(-0.001314): nan
std::log2(-100.001): nan
std::log2(-200.001): nan
std::log2(-300.001): nan
std::log2(-400.001): nan
std::log2(-500.001): nan
std::log2(-600.001): nan
std::log2(-700.001): nan
std::log2(-800.001): nan
std::log2(-900.001): nan