如果不可能,计算 x^n 并返回整数限制而不溢出的元函数?

2024-01-12

考虑以下代码:

template <std::intmax_t Base, std::intmax_t Exponent> 
struct integer_power_bounded
{
    static_assert(Exponent >= 0, 
                  "Error in 'integer_power_bounded': 'Exponent >= 0' is false");
    static constexpr std::intmax_t value = /* something */;
};

template <std::intmax_t Base> 
struct integer_power_bounded<Base, 0>
{
    static constexpr std::intmax_t value = 1;
};

代替/* something */, 我想返回std::numeric_limits<std::intmax_t>::min() or std::numeric_limits<std::intmax_t>::max() if Base^Exponent不能用a来表示std::intmax_t。困难的是避免计算过程中的溢出,因为它们会在编译时产生错误。

如何做到这一点(没有提升)?


基于SFINAE的版本:

#include <cstdint>
#include <cmath>
#include <limits>
#include <type_traits>

constexpr std::intmax_t integer_power(std::intmax_t base,
                                      std::intmax_t exponent)
{
    return (exponent == 0) ? 1 :
           (exponent % 2 == 0) ?  integer_power(base, exponent/2)
                                 *integer_power(base, exponent/2) :
           base*integer_power(base, exponent-1);
}

namespace detail
{
    template<std::intmax_t base, std::intmax_t exponent,
             std::intmax_t res = integer_power(base,exponent)>
    constexpr std::intmax_t pow_helper(int)
    {
        return res;
    }

    template<std::intmax_t base, std::intmax_t exponent>
    constexpr std::intmax_t pow_helper(...)
    {
        return (exponent%2 == 0 || base > 0)
               ? std::numeric_limits<std::intmax_t>::max()
               : std::numeric_limits<std::intmax_t>::min();
    }
}

template<std::intmax_t base, std::intmax_t exponent>
constexpr std::intmax_t integer_power_bounded()
{
    return detail::pow_helper<base,exponent>(0);
}

使用示例:

#include <iostream>
int main()
{
    std::cout << sizeof(std::intmax_t) << '\n';

    constexpr auto p2t6 = integer_power_bounded<2, 6>();
    constexpr auto p2t62 = integer_power_bounded<2, 62>();
    constexpr auto p2t63 = integer_power_bounded<2, 63>();
    constexpr auto p2t64 = integer_power_bounded<2, 64>();
    constexpr auto p2t65 = integer_power_bounded<2, 65>();

    std::cout << "2^6 == " << p2t6 << '\n';
    std::cout << "2^62 == " << p2t62 << '\n';
    std::cout << "2^63 == " << p2t63 << '\n';
    std::cout << "2^64 == " << p2t64 << '\n';
    std::cout << "2^65 == " << p2t65 << '\n';

    constexpr auto pm2t6 = integer_power_bounded<-2, 6>();
    constexpr auto pm2t62 = integer_power_bounded<-2, 62>();
    constexpr auto pm2t63 = integer_power_bounded<-2, 63>();
    constexpr auto pm2t64 = integer_power_bounded<-2, 64>();
    constexpr auto pm2t65 = integer_power_bounded<-2, 65>();

    std::cout << "-2^6 == " << pm2t6 << '\n';
    std::cout << "-2^62 == " << pm2t62 << '\n';
    std::cout << "-2^63 == " << pm2t63 << '\n';
    std::cout << "-2^64 == " << pm2t64 << '\n';
    std::cout << "-2^65 == " << pm2t65 << '\n';
}

Output:



8
2^6 == 64
2^62 == 4611686018427387904
2^63 == 9223372036854775807
2^64 == 9223372036854775807
2^65 == 9223372036854775807
-2^6 == 64
-2^62 == 4611686018427387904
-2^63 == -9223372036854775808
-2^64 == 9223372036854775807
-2^65 == -9223372036854775808  

解释:

常量表达式不能包含未定义行为 [expr.const]/2:

  • 具有未定义行为的操作 [Note:例如,包括有符号整数溢出、某些指针算术、除以零或某些移位操作 —end note];

因此,每当无界的 integer_power产生溢出,用于声明的表达式std::integral_constant不是有效的常量表达式;替换失败并使用后备函数。

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

如果不可能,计算 x^n 并返回整数限制而不溢出的元函数? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 重载<<的返回值

    include
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何忽略已经提交的文件?

    之前 以下是我的 gitignore file config database yml DS Store 后来我创建了一个app config yml文件放在 config 目录中并提交 现在 我意识到我不需要app config ymlg
  • 无法从 onBackgroundMessage 启动 Activity

    刚刚创建了一个新的 Flutter 应用程序 最终当我收到通知时尝试打开我的应用程序或显示全屏活动 例如电话 现在只是尝试控制台登录通过后台消息处理程序调用的本机类 当我发送通知时收到此错误 您看到我做错了什么吗 我应该有不同的方法来处理这
  • SQL Server 快进游标

    人们普遍认为 应尽可能避免在存储过程中使用游标 用基于集合的逻辑等替换 如果您需要迭代某些数据 并且可以以只读方式执行 那么快进 只读前进 游标是否比 while 循环效率更高或更低 根据我的调查 光标选项通常速度更快 并且使用更少的读取和
  • 如何在 Thymeleaf 中使用 Dates.Format 和区域设置

    我正在尝试使用 Thymeleaf 中的区域设置格式化日期 我已经使用了dates format td td td td 但以上都不起作用 我基于这个已经解决的问题https github com thymeleaf thymeleaf e
  • .NET 中的货币格式

    我试图了解货币格式在 NET 框架中的工作原理 据我了解 Thread CurrentCulture NumberFormatInfo CurrencySymbol 包含当地文化的货币符号 但在我看来 在现实世界中 特定文化和货币符号之间并
  • 方法头中“静态”的含义是什么?

    我想了解 writeNumbers 方法标头中的 static 一词有何作用 public class DisplayClass param args public static void main String args writeNum
  • 接收参数并移动可能失败的函数的语义(强大的异常安全性)

    我有一个函数 可以对作为接收器参数传入的大量数据进行操作 我的BigDatatype 已经支持 C 11 并且带有功能齐全的移动构造函数和移动赋值实现 因此我可以摆脱困境 而不必复制该死的东西 Result processBigData B
  • 这段C代码有什么问题吗?

    我的源代码 include
  • 为 Java 程序制作 OSX 应用程序包,而无需用户界面在应用程序运行时保留在 Dock 中

    今天我尝试为 Java 应用程序创建我的第一个 OSX 应用程序包 它有效 但有一个问题 我找不到任何解决方案 Java 应用程序是一个没有用户界面的 Web 服务器 当我启动应用程序包时会发生以下情况 应用程序图标在 Dock 中弹跳几次
  • 查找一组垂直线段中所有不相交的交点

    我有一组由 y1 和 y2 坐标定义的垂直区域 其中 y1 是每个区域的起点 y2 是终点 我的坐标系原点是左上角 因此 y2 始终大于 y1 这是一个例子 var regions 10 100 50 120 60 180 140 220
  • 带有托管扩展框架 (MEF) 的工厂模式

    我正在尝试使用 MEF 实现工厂模式 这是我的解决方案 核心项目 IClass ObjectFactory static Class This is where the problem is 项目A Export typeof IClass
  • 删除 SQL Server 中的记录后重置身份种子

    我已将记录插入 SQL Server 数据库表中 该表定义了主键 并且自动增量身份种子设置为 是 这样做主要是因为在 SQL Azure 中 每个表都必须定义主键和标识 但由于我必须从表中删除一些记录 这些表的身份种子将受到干扰 并且索引列
  • 是否可以使用隐式证据来强制抽象类型之间的静态类型兼容性?

    假设具有以下特征 trait A type B def a A A 我使用抽象类型是因为我不想每次需要 A 时都在类型签名中拖动 B 是否仍然可以向 方法添加任何隐式证据 使用 我的第一反应是拒绝 但 scala 之前就给我带来了惊喜 任何
  • Spring Integration - 当服务激活器组件中发生异常时写入错误队列

    我开始使用 Spring 集成 如果可能的话 我不知道如何解决这种情况 我想自动 捕获 应用程序的服务激活器中可能发生的每个异常 并将此错误发送到专用队列 网关不是一个解决方案 因为我需要一些自定义代码 所以如果我正确理解了原理 我必须使用
  • 使图像文件在 Lollipop 上的 Android Gallery 中可见

    我试图使应用程序中拍摄的一些照片在图库中可见 以便可以在应用程序外部共享和查看它们 但我想将图像本身保留在应用程序的数据目录中 以便当应用程序被删除 它们被删除 因此它们存储在 sdcard Android data appID 图片 子文
  • Flutter 嵌套 JSON 解析

    我这里有一个嵌套的 JSON api Employee Name Michael Jackson Identification 881228145031 Company Test Corporate DateOfBirth 1988 12
  • Gettext 不起作用,没有错误消息,使用 php 5.3

    我已经在这件事上摸索了好几天了 但没有成功 我只是想让 gettext 工作 发生的情况是打印 php 文件中写入的字符串 而不是翻译后的字符串 IE 如果我做 echo gettext Service 然后打印 Service 而不是瑞典
  • Visual Studio 2008 中缺少 T4 代码生成?

    所以我决定卷起袖子尝试一下 VS2008 内置的 T4 代码生成 我打算继续写这篇文章 http www olegsych com 2008 09 t4 tutorial creatating your first code generat
  • Prolog - 描述事实和规则

    我想在序言中描述以下事实和规则 Nick 正在使用 Java 进行编程 Nick 正在使用 Python 编程 Nick 是任何使用 Java 和 Python 编程的人的朋友 Jim 可以使用 Nick 所使用的所有语言进行编程 我找到了
  • 如果不可能,计算 x^n 并返回整数限制而不溢出的元函数?

    考虑以下代码 template