为什么 std::pow(double, int) 从 C++11 中删除?

2024-04-17

在调查的同时计算 p^q(求幂)的有效方法,其中 q 是整数 https://stackoverflow.com/questions/5625431回顾 C++98 和 C++11 标准,我注意到显然std::pow(double, int)C++11 中删除了重载。

在 C++98 26.5/6 中它有double pow(double, int);签名。

在 C++11 26.8 中,我能找到的只是重载,需要一对float, double, or long double,并明确指出,在混合使用参数类型积分和双精度的情况下,pow(double, double)应选择过载。

这是否只是对先前意图的澄清,它们是否在 C++98 中被错误添加,是否实际上在 C++11 中被删除,或者其他什么?

显然pow(double, int)版本提供了一个很好的优化机会,因此将它们删除似乎很奇怪。编译器是否仍符合提供此类优化重载的标准?


double pow(double, int);

尚未从规范中删除。它只是被改写了。它现在位于 [c.math]/p11 中。如何计算是一个实现细节。唯一改变的 C++03 签名是:

float pow(float, int);

现在返回双倍:

double pow(float, int);

And this为了 C 兼容性而进行了更改。

澄清:

26.8 [cmath] / p11 说:

此外,还应有额外的 过载足以确保:

  1. 如果任何对应于 double 形参的实参的类型为 long double, 那么所有参数对应于 双参数被有效地转换 至长双倍。

  2. 否则,如果任何参数对应于双参数 具有 double 类型或整数类型, 那么所有参数对应于 双参数被有效地转换 加倍。

  3. 否则,与双参数对应的所有参数都是 有效地投射到漂浮状态。

本段暗示了一大堆重载,包括:

double pow(double, int);
double pow(double, unsigned);
double pow(double, unsigned long long);

etc.

这些可能是实际的重载,或者可以使用受限模板来实现。我个人已经用这两种方式实现了它,并且强烈支持受限模板实现。

解决优化问题的第二次更新:

允许实现优化任何过载。但请记住,优化应该是only那。优化版本应该返回相同的答案。像 pow 这样的函数的实现者的经验是,当您费尽心思确保采用积分指数的实现与采用浮点指数的实现给出相同的答案时,“优化”通常会更慢。

作为演示,以下程序打印出pow(.1, 20)两次,一次使用 std::pow,第二次使用利用积分指数的“优化”算法:

#include <cmath>
#include <iostream>
#include <iomanip>

int main()
{
    std::cout << std::setprecision(17) << std::pow(.1, 20) << '\n';
    double x = .1;
    double x2 = x * x;
    double x4 = x2 * x2;
    double x8 = x4 * x4;
    double x16 = x8 * x8;
    double x20 = x16 * x4;
    std::cout << x20 << '\n';
}

在我的系统上打印出:

1.0000000000000011e-20
1.0000000000000022e-20

或者用十六进制表示法:

0x1.79ca10c92422bp-67
0x1.79ca10c924232p-67

是的,pow 的实现者确实担心所有这些低端的位。

所以虽然有洗牌的自由pow(double, int)转向单独的算法,我知道的大多数实现者都放弃了该策略,除了检查非常小的积分指数之外。在这种情况下,将检查放入带有浮点指数的实现中通常是有利的,以便为您的优化带来最大的收益。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 std::pow(double, int) 从 C++11 中删除? 的相关文章

随机推荐

  • 插入事务和参数?

    我正在学习 VB Net 需要使用开源 System Data SQLite ADO Net 解决方案来处理 SQLite 数据库 我在 HOWTO 部分找到的示例仅是 C 语言的 有人可以在 VB Net 中提供一个简单的示例吗 我可以研
  • 塔楼高度之间的最小差异?

    我正在做一些面试问题 我看到了这个 已知 n 座塔的高度和 k 值 您必须将每个塔的高度增加或减少 k 您需要最小化最长和最短塔的高度之间的差异并输出该差异 我想答案将是 maxheight k minheight k 我已经尝试过一些测试
  • 如何禁用 Android Oreo 中用于 espresso 测试的新自动填充功能

    在 Android 设备上运行测试sdk 26导致他们因为新的失败Autofill https developer android com guide topics text autofill html当 espresso 尝试单击字段时隐
  • 如何在rails中使用动态绑定执行原始更新sql

    我想执行一个更新原始 SQL 如下所示 update table set f1 where f2 and f3 这条 SQL 将被执行ActiveRecord Base connection execute 但我不知道如何将动态参数值传递到
  • 捕获测试用例顺序

    我可以保证多个的执行顺序吗TEST CASEs with Catch https github com philsquared Catch 我正在使用 LLVM 测试一些代码 它们有一些我需要显式初始化的卑鄙的全局状态 现在我有一个这样的测
  • RODBC 错误 - ODBC 连接失败 - 无法使用我的 Mac 连接到 MySQL(小牛)

    我正在尝试在我的 mac 小牛 上使用 RODBC 通过 R 连接到 mysql 数据库 但经过几个小时的愚蠢努力后 我仍然无法让它工作 当我尝试连接到数据库时 RODBC 抛出此错误 错误消息非常简洁 我不知道这意味着什么 ch 我按照以
  • AWS RDS 公共访问

    我对 AWS 配置感到困惑 我的目标是创建一个可从网络内部和外部访问的数据库 这是我所拥有的 RDS 实例运行 postgresql VPC 内部的连接正常工作 端点被设置为可公开访问 当从外部访问时 实际上确实可以解析 但是 连接挂起 表
  • 如何验证一个 XSD 架构是另一个 XSD 架构的子集?

    如何验证一个 XSD 架构是否是另一个 XSD 架构的子集 我们正在使用 蓝图 XSD 模式的集合 定义子组件可用的所有可能的输入或输出 创建一个系统应用程序 许多子组件正在被实现 并且这些子组件使用 XML 文件在它们之间传递数据 每个子
  • 选择特定日期之后的数据

    我希望能够从数据框中选择特定日期之后或之前的日期 例如 使用黄金价格的 quandl 数据 pGold lt read csv http www quandl com api v1 datasets BUNDESBANK BBK01 WT5
  • 从光滑表定义创建表

    在 PlaySlick 示例中 有一个包含示例数据访问对象的文件 https github com playframework play slick blob master samples basic app dao CatDAO scal
  • 条件渲染和 ReactCSSTransitionGroup 动画

    我制作了一个小应用程序 它根据 Redux 状态呈现不同的组件 我想在其中一个组件渲染时应用 淡入淡出 动画 但是 由于某种原因 它对我不起作用 这是我到目前为止所拥有的 内容 js class Content extends Compon
  • 根据速度或其他变量向左、向右、向上和向下滑动

    我有一个从简单的手势扩展而来的类 我正在使用 onfling 方法 class MyGestureListener extends GestureDetector SimpleOnGestureListener Override publi
  • 这是 C 中未定义的行为吗? [复制]

    这个问题在这里已经有答案了 我正在 gcc 上运行我的 C 代码来理解前 后增量运算符 然而我看到的结果并不是我所期望的 就像第 6 行一样 因为 i 是 5 所以应该是 8 7 6 5 5 但它是8 7 6 5 8 然后到最后一行 显示1
  • 如何在 PHP 中的会话中存储对象?

    您好 我想使用类似的类在会话中存储或保存对象SessionHandler或数组 SESSION 我已经看到如果我序列化该对象是可能的 并且我不想丢失该对象实例的方法 我已经看到序列化是可能的 但我想要存储的对象是由 PDOStatement
  • Windows 版 GitHub:登录失败

    我当时用的是git scm http git scm com用客户端很久了 看到了一个 GitHub for Windows 客户端 为什么不试试呢 我用CCleaner删除了git scm 然后安装了这个客户端 在登录阶段 它显示 登录失
  • Proguard AWS s3 问题

    尝试为 amazon s3 实现 proguard 时遇到一个真正的问题 它在第 29 行加载应用程序时不断崩溃 即 s3Client new AmazonS3Client new BasicAWSCredentials Constants
  • 对行进行排序后,Ag-grid 拖放不起作用

    在 Ag grid react 上对行进行排序后 拖放停止工作 在排序之前 拖放已全部设置完毕并且运行良好 postSort API 似乎没有什么可以实现我需要的东西 重置行 甚至设置可拖动 就像选择一样 postSort nodes gt
  • 从谷歌地图中删除标记簇[不仅仅是标记]

    在我的phonegapp cordova应用程序中 我使用谷歌地图工具 有时我需要更改其上显示的点 我发现了一些有用的代码here https developers google com maps documentation javascr
  • 集成 Gitlab 和 TravisCi

    有没有办法将 Travis Ci 与 Gitlab 集成 或者至少使用用户名和密码而不是 Github 凭据登录 TravisCi 不 截至目前 Travis CI 与 GitHub 严格绑定 虽然确实有关于减少这一要求的讨论 但它仍然存在
  • 为什么 std::pow(double, int) 从 C++11 中删除?

    在调查的同时计算 p q 求幂 的有效方法 其中 q 是整数 https stackoverflow com questions 5625431回顾 C 98 和 C 11 标准 我注意到显然std pow double int C 11