C++11标准模板(STL)- 常用数学函数 - 计算常用对数 (底为10) (log10(x))(std::log10, std::log10f, std::log10l)

常用数学函数

计算常用对数 (底为10) (log10(x))

std::log10, 
std::log10f, 
std::log10l

定义于头文件 <math.h>

float       log10f( float arg );

(1)(C99 起)

double      log10( double arg );

(2)

long double log10l( long double arg );

(3)(C99 起)

定义于头文件 <tgmath.h>

#define log10( arg )

(4)(C99 起)

1-3) 计算 arg 的常用(底 10 )对数。

4) 泛型宏:若 arg 拥有 long double 类型,则调用 log10l 。否则,若 arg 拥有整数类型或 double 类型,则调用 log10 。否则调用 log10f

参数

arg-浮点值

返回值

若不出现错误,则返回 arg 的常用(底 10 )对数( log
10(arg) 或 lg(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 < 1000; i += 100)
    {
        std::cout << "std::log10(" << fNumber + i << "):   "
                  << std::log10(fNumber + i) << std::endl;
    }
    std::cout << std::endl;

    for (int i = 0; i < 1000; i += 100)
    {
        std::cout << "std::log10(" << -fNumber - i << "):   "
                  << std::log10(-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::log10(" << dNumber + i << "):   "
                  << std::log10(dNumber + i) << std::endl;
    }
    std::cout << std::endl;

    for (int i = 0; i < 1000; i += 100)
    {
        std::cout << "std::log10(" << -dNumber - i << "):   "
                  << std::log10(-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::log10(" << ldNumber + i << "):   "
                  << std::log10(ldNumber + i) << std::endl;
    }
    std::cout << std::endl;

    for (int i = 0; i < 1000; i += 100)
    {
        std::cout << "std::log10(" << -ldNumber - i << "):   "
                  << std::log10(-ldNumber - i) << std::endl;
    }
    std::cout << std::endl;

    return 0;
}

输出

typeid(float).name():   f
std::log10(0.1314):   -0.881405
std::log10(100.131):   2.00057
std::log10(200.131):   2.30132
std::log10(300.131):   2.47731
std::log10(400.131):   2.6022
std::log10(500.131):   2.69908
std::log10(600.131):   2.77825
std::log10(700.131):   2.84518
std::log10(800.131):   2.90316
std::log10(900.131):   2.95431

std::log10(-0.1314):   nan
std::log10(-100.131):   nan
std::log10(-200.131):   nan
std::log10(-300.131):   nan
std::log10(-400.131):   nan
std::log10(-500.131):   nan
std::log10(-600.131):   nan
std::log10(-700.131):   nan
std::log10(-800.131):   nan
std::log10(-900.131):   nan

typeid(double).name():   d
std::log10(0.01314):   -1.8814
std::log10(100.013):   2.00006
std::log10(200.013):   2.30106
std::log10(300.013):   2.47714
std::log10(400.013):   2.60207
std::log10(500.013):   2.69898
std::log10(600.013):   2.77816
std::log10(700.013):   2.84511
std::log10(800.013):   2.9031
std::log10(900.013):   2.95425

std::log10(-0.01314):   nan
std::log10(-100.013):   nan
std::log10(-200.013):   nan
std::log10(-300.013):   nan
std::log10(-400.013):   nan
std::log10(-500.013):   nan
std::log10(-600.013):   nan
std::log10(-700.013):   nan
std::log10(-800.013):   nan
std::log10(-900.013):   nan

typeid(long double).name():   e
std::log10(0.001314):   -2.8814
std::log10(100.001):   2.00001
std::log10(200.001):   2.30103
std::log10(300.001):   2.47712
std::log10(400.001):   2.60206
std::log10(500.001):   2.69897
std::log10(600.001):   2.77815
std::log10(700.001):   2.8451
std::log10(800.001):   2.90309
std::log10(900.001):   2.95424

std::log10(-0.001314):   nan
std::log10(-100.001):   nan
std::log10(-200.001):   nan
std::log10(-300.001):   nan
std::log10(-400.001):   nan
std::log10(-500.001):   nan
std::log10(-600.001):   nan
std::log10(-700.001):   nan
std::log10(-800.001):   nan
std::log10(-900.001):   nan

### C++ `std::sort` 函数的用法 `std::sort` 是 C++ STL 中的一个高效排序算法,通常实现为快速排序或 introsort(一种混合排序)。它可以用于对数组、向量或其他支持随机访问迭代器的数据结构进行排序。 #### 基本语法 以下是 `std::sort` 的基本形式: ```cpp #include <algorithm> template< class RandomIt > void sort( RandomIt first, RandomIt last ); ``` 参数说明如下: - `first`: 排序范围的第一个元素。 - `last`: 超过最后一个要排序元素的位置。 此函数会对 `[first, last)` 范围内的元素进行升序排列[^3]。 如果需要自定义排序顺序,则可以传递第三个参数作为比较函数: ```cpp template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); ``` 其中 `comp` 是一个二元谓词,返回布尔值来决定两个元素之间的相对次序[^4]。 #### 示例代码 ##### 对整数数组进行升序排序 ```cpp #include <iostream> #include <vector> #include <algorithm> // 包含 std::sort 定义 int main() { std::vector<int> vec = {5, 2, 9, 1, 5, 6}; std::sort(vec.begin(), vec.end()); // 默认升序 for (const auto& elem : vec) { std::cout << elem << " "; } } // 输出: 1 2 5 5 6 9 ``` ##### 使用自定义比较函数降序排序 ```cpp bool desc_compare(int a, int b) { return a > b; // 返回 true 表示 a 应该排在前面 } int main() { std::vector<int> vec = {5, 2, 9, 1, 5, 6}; std::sort(vec.begin(), vec.end(), desc_compare); for (const auto& elem : vec) { std::cout << elem << " "; } } // 输出: 9 6 5 5 2 1 ``` ##### 对字符串向量按照长度排序 ```cpp #include <string> bool compare_by_length(const std::string &a, const std::string &b) { return a.size() < b.size(); } int main() { std::vector<std::string> words = {"apple", "banana", "pear", "kiwi"}; std::sort(words.begin(), words.end(), compare_by_length); for (const auto& word : words) { std::cout << word << " "; } } // 输出: kiwi pear apple banana ``` #### 性能特点 - 平均时间复杂度为 O(N log N),最坏情况下可能退化到 O()[^5]。 - 需要随机访问迭代器的支持,因此无法直接应用于链表等不支持随机访问的数据结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值