计算以2为底的log

在学习 大数n!算法时, 想到log2(x)怎么算?

math.h中没有log2接口, 只有log和log10.

上网查了下, 原来用对数换底公式可以搞定这事^_^

// @file power_exp_log.cpp
// @brief 计算以2为底的log

#include <iostream>                 // for i/o functions
#include <math.h>                   // for exp(), log(), and log10()
#include <conio.h>

using namespace std;

#define CONST_E 2.718282 ///< 常数e的值约为2.718282

/// math.h中没有log2的函数
double log2(double dblpow2);

void fnTest_power_exp_log_2(); ///< 用对数换底公式做
void fnTest_power_exp_log_E();
void fnTest_power_exp_log_10();

int main(int argc, char* argv[])
{
    fnTest_power_exp_log_2();
    // fnTest_power_exp_log_E();
    // fnTest_power_exp_log_10();

    printf("END, press any key to quit\n");
    _getch();
    return 0;
}

double log2(double dblpow2)
{
    /**
    math.h中没有log2的接口
    用对数换底公式来间接计算

    对数换底公式
    Loga(B) = logc(B) / logc(A)
    a, c均大于0且不等于1

    math.h中有log和log10
    logc 可以用log或1og10
    */

    double dbllog2 = 0;
    dbllog2 = log(dblpow2) / log(2);
    return dbllog2;
}

void fnTest_power_exp_log_2()
{
    double dblIndex = 0;
    double dblpow = 0;
    double dbllog = 0;

    for (dblIndex = 0; dblIndex <= 10; dblIndex++)
    {
        dblpow = pow(2, dblIndex);
        printf("pow(2, %f) = %f\n", 
            dblIndex, dblpow);

        dbllog = log2(dblpow);
        printf("log2(%f) = %f\n", 
            dblpow, dbllog);

        printf("\r\n");
    }

    /** run result
    pow(2, 0.000000) = 1.000000
    log2(1.000000) = 0.000000

    pow(2, 1.000000) = 2.000000
    log2(2.000000) = 1.000000

    pow(2, 2.000000) = 4.000000
    log2(4.000000) = 2.000000

    pow(2, 3.000000) = 8.000000
    log2(8.000000) = 3.000000

    pow(2, 4.000000) = 16.000000
    log2(16.000000) = 4.000000

    pow(2, 5.000000) = 32.000000
    log2(32.000000) = 5.000000

    pow(2, 6.000000) = 64.000000
    log2(64.000000) = 6.000000

    pow(2, 7.000000) = 128.000000
    log2(128.000000) = 7.000000

    pow(2, 8.000000) = 256.000000
    log2(256.000000) = 8.000000

    pow(2, 9.000000) = 512.000000
    log2(512.000000) = 9.000000

    pow(2, 10.000000) = 1024.000000
    log2(1024.000000) = 10.000000
    */
}

void fnTest_power_exp_log_10()
{
    double dblIndex = 0;
    double dblpow = 0;
    double dbllog = 0;

    for (dblIndex = 0; dblIndex <= 10; dblIndex++)
    {
        dblpow = pow(10, dblIndex);
        printf("pow(10, %f) = %f\n", 
            dblIndex, dblpow);

        dbllog = log10(dblpow);
        printf("log10(%f) = %f\n", 
            dblpow, dbllog);

        printf("\r\n");
    }

    /** run result
    pow(10, 0.000000) = 1.000000
    log10(1.000000) = 0.000000

    pow(10, 1.000000) = 10.000000
    log10(10.000000) = 1.000000

    pow(10, 2.000000) = 100.000000
    log10(100.000000) = 2.000000

    pow(10, 3.000000) = 1000.000000
    log10(1000.000000) = 3.000000

    pow(10, 4.000000) = 10000.000000
    log10(10000.000000) = 4.000000

    pow(10, 5.000000) = 100000.000000
    log10(100000.000000) = 5.000000

    pow(10, 6.000000) = 1000000.000000
    log10(1000000.000000) = 6.000000

    pow(10, 7.000000) = 10000000.000000
    log10(10000000.000000) = 7.000000

    pow(10, 8.000000) = 100000000.000000
    log10(100000000.000000) = 8.000000

    pow(10, 9.000000) = 1000000000.000000
    log10(1000000000.000000) = 9.000000

    pow(10, 10.000000) = 10000000000.000000
    log10(10000000000.000000) = 10.000000
    */
}

void fnTest_power_exp_log_E()
{
    double dblIndex = 0;
    double dblexp = 0;
    double dblpow = 0;
    double dbllog = 0;

    for (dblIndex = 0; dblIndex <= 10; dblIndex++)
    {
        dblpow = pow(CONST_E, dblIndex);
        printf("pow(CONST_E, %f) = %f\n", 
            dblIndex, dblpow);

        dblexp = exp(dblIndex);
        printf("exp(%f) = %f\n", 
            dblIndex, dblexp);

        dbllog = log(dblexp);
        printf("log(%f) = %f\n", 
            dblexp, dbllog);

        printf("\r\n");
    }

    /** run result
    pow(CONST_E, 0.000000) = 1.000000
    exp(0.000000) = 1.000000
    log(1.000000) = 0.000000

    pow(CONST_E, 1.000000) = 2.718282
    exp(1.000000) = 2.718282
    log(2.718282) = 1.000000

    pow(CONST_E, 2.000000) = 7.389057
    exp(2.000000) = 7.389056
    log(7.389056) = 2.000000

    pow(CONST_E, 3.000000) = 20.085541
    exp(3.000000) = 20.085537
    log(20.085537) = 3.000000

    pow(CONST_E, 4.000000) = 54.598164
    exp(4.000000) = 54.598150
    log(54.598150) = 4.000000

    pow(CONST_E, 5.000000) = 148.413206
    exp(5.000000) = 148.413159
    log(148.413159) = 5.000000

    pow(CONST_E, 6.000000) = 403.428946
    exp(6.000000) = 403.428793
    log(403.428793) = 6.000000

    pow(CONST_E, 7.000000) = 1096.633643
    exp(7.000000) = 1096.633158
    log(1096.633158) = 7.000000

    pow(CONST_E, 8.000000) = 2980.959492
    exp(8.000000) = 2980.957987
    log(2980.957987) = 8.000000

    pow(CONST_E, 9.000000) = 8103.088530
    exp(9.000000) = 8103.083928
    log(8103.083928) = 9.000000

    pow(CONST_E, 10.000000) = 22026.479695
    exp(10.000000) = 22026.465795
    log(22026.465795) = 10.000000
    */
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值