C ++中的指数运算符

时间:2010-09-23 03:24:11

标签: c++ exponential

我正在上C ++课,我注意到只有几个数学运算符可供使用。 我还注意到C ++在其数学库中没有指数运算符。

为什么必须总是为此编写一个函数? C ++的制造商是否有理由省略此运算符?

5 个答案:

答案 0 :(得分:50)

为此写一个函数(当然,除非你疯了)。 <cmath>标题中定义了perfectly good pow function

  

除了:如果你试图使用^作为权力运营商,就像有些人常常做的那样,你会遇到一个令人讨厌的惊喜。它是独占或(XOR)运算符(参见here)。

答案 1 :(得分:9)

当C被发明时,大多数C操作很容易映射到单个处理器指令。当时,取幂不是机器指令,因此是库例程。

答案 2 :(得分:7)

根据Bjarne Stroustrup在他的书“ C ++的设计和演变”中的说法。他们决定避免使用指数运算符,因为:

  • 运营商提供符号方便,但不提供任何新功能。代表科学/工程计算的重度用户的工作组成员表示,操作员语法提供了较小的语法便利。
  • C ++的每个用户都必须学习这个新功能
  • 用户强调了为系统默认设置使用自己的专用取幂函数的重要性,这对于内部运算符是不可能的
  • 该提案的动机不足。特别是,通过查看一个30000行的Fortran程序,我不能断定运算符将在C ++中广泛使用
  • 该提案需要添加新的运算符并添加另一个优先级,从而增加语言的复杂性

答案 3 :(得分:1)

Python具有**运算符用于求幂。 在C ++中,您实际上可以使用一些技巧来定义类似的运算符。 通过将一元*运算符与二元*运算符组合在一起,如下所示:

#include <cmath>
#include <iostream>

struct Num {
    double value;

    Num(double value) : value(value) { }

    typedef Num* HalfStar;

    HalfStar operator*() const { return HalfStar(this); }
    Num operator*(const HalfStar& rhs) const
    {
        return Num(std::pow(value, rhs->value));
    }
    Num operator*(const Num& rhs) const
    {
        return Num(value * rhs.value);
    }

    friend std::ostream& operator<<(std::ostream& os, const Num& n)
    {
        return os << n.value;
    }
};

int main(int argc, char**argv)
{
    Num a = 10;
    Num b = 9;

    std::cout << "a*b = " << (a*b) << "\n";
    std::cout << "a**b = " << (a**b) << "\n";

    return 0;
}

尽管这不适用于非类类型,所以您不能这样做:x**2

有关实时示例,请参见here

答案 4 :(得分:-3)

您使用的是哪个平台和哪个编译器?我的猜测是TurboC。主要是cmath文件具有其他编译器所涵盖的大部分数学函数。