c++ - 为什么标准 C++ 库中没有 `int pow(int base, int exponent)`?

标签 c++ math integer standard-library pow

我觉得我一定是找不到它。 C++ pow 有什么原因吗?除了 float 之外,function 没有为任何东西实现“power”功能。 s 和 double ?

我知道实现是微不足道的,我只是觉得我正在做应该在标准库中的工作。一个健壮的幂函数(即以某种一致的、明确的方式处理溢出)写起来并不有趣。

最佳答案

截至 C++11 ,特殊情况已添加到幂函数(和其他函数)套件中。 C++11 [c.math] /11状态,在列出所有 float/double/long double 之后重载(我的重点和解释):

Moreover, there shall be additional overloads sufficient to ensure that, if any argument corresponding to a double parameter has type double or an integer type, then all arguments corresponding to double parameters are effectively cast to double.


因此,基本上,整数参数将升级为 double 以执行操作。

之前 C++11 (这是问你问题的时候),不存在整数重载。
因为我与 C 的创作者都没有密切联系。也不是 C++在他们创建的日子里(虽然我已经很老了),也不是创建标准的 ANSI/ISO 委员会的一部分,这必然是我的观点。我想认为这是明智的意见,但正如我妻子会告诉你的(经常而且不需要太多鼓励),我以前错了:-)
假设,对于它的值(value),如下。
我怀疑原来是ANSI前的原因C没有这个功能是因为它完全没有必要。首先,已经有一种非常好的整数幂的方法(使用 double ,然后简单地转换回整数,在转换之前检查整数上溢和下溢)。
其次,你要记住的另一件事是C的初衷。作为一种系统编程语言,浮点数在该领域是否可取是值得怀疑的。
由于其最初的用例之一是对 UNIX 进行编码,因此浮点数几乎毫无用处。 C 所基于的 BCPL 也没有使用幂(从内存中它根本没有浮点数)。

As an aside, an integral power operator would probably have been a binary operator rather than a library call. You don't add two integers with x = add (y, z) but with x = y + z - part of the language proper rather than the library.


第三,由于积分功能的实现相对微不足道,几乎可以肯定语言的开发人员会更好地利用他们的时间提供更多有用的东西(请参阅下面关于机会成本的评论)。
这也与原始 C++ 有关.由于最初的实现实际上只是一个生成 C 的翻译器。代码,它继承了 C 的许多属性.它的初衷是 C-with-classes,而不是 C-with-classes-plus-a-little-bit-of-extra-math-stuff。
至于为什么之前从未加入标准C++11 ,您必须记住,标准制定机构有要遵循的特定准则。例如,ANSI C专门负责编纂现有的实践,而不是创造一种新的语言。否则,他们可能会发疯并给我们 Ada :-)
该标准的后续迭代也有特定的指导方针,可以在理由文件中找到(关于委员会为什么做出某些决定的理由,而不是语言本身的理由)。
例如 C99基本原理文件中专门发扬了C89中的两个限制可添加内容的指导原则:
  • 保持语言小而简单。
  • 仅提供一种操作方式。

  • 指南(不一定是那些特定的)是为各个工作组制定的,因此限制了 C++委员会(和所有其他 ISO 组)也是如此。
    此外,标准制定机构意识到他们做出的每一个决定都有机会成本(一个经济术语,意思是你必须放弃做出的决定)。例如,购买那台值(value) 10,000 美元的 super 游戏机的机会成本是与您的另一半保持亲密关系(或可能是所有关系)大约六个月。
    Eric Gunnerson 用他的 -100 points explanation 很好地解释了这一点。至于为什么不总是添加到 Microsoft 产品中的原因 - 基本上一个功能从 100 点开始,所以它必须增加相当多的值(value)才能被考虑。
    换句话说,您更愿意在标准中添加一个完整的幂操作符(老实说,任何一个半体面的编码器都可以在十分钟内完成)或多线程?就我自己而言,我更喜欢后者,而不必考虑 UNIX 和 Windows 下的不同实现。
    我还希望看到标准库(哈希、btree、红黑树、字典、任意映射等)成千上万的集合,但是,正如基本原理所述:

    A standard is a treaty between implementer and programmer.


    并且标准机构的实现者数量远远超过程序员(或至少那些不了解机会成本的程序员)的数量。如果添加了所有这些东西,下一个标准 C++将是 C++215x并且可能会在三百年后由编译器开发人员完全实现。
    无论如何,这是我对此事的(相当多的)想法。如果只根据数量而不是质量来投票,我很快就会把其他所有人都吹走。感谢收听:-)

    关于c++ - 为什么标准 C++ 库中没有 `int pow(int base, int exponent)`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398442/

    相关文章:

    java - 最终结果的平方根距离计算给出了不同的结果

    javascript - 现在有多少位可用于 JS 风格的 "integer"数学?

    c - 通过套接字发送整数,同时避免违反严格的别名规则

    c++ - 有没有更有效的方法从流中设置 std::vector ?

    c++ - 永远不会使用 ifstream (cpp) 达到 eof

    java - 有效地计算乘积 a * b² * c³ ...

    javascript - 有没有办法从 4x4 矩阵计算 X 和 Y 轴上的 3D 旋转

    c - 如何对整数的数字求和

    c++ - 优化在网格图中查找哈密顿循环的函数?

    c++ - 如何使用颜色将 QPlainTextEdit 内容渲染到 QPixmap?