GMP pow 中的溢出处理

2023-11-23

(我只是 GMP 库的间接用户,主要通过swi-prolog and yap。但我对解决这个问题非常感兴趣。)

当使用大得离谱的值执行求幂时,主机系统或 GMP 不再能够适当地处理溢出。我已经与上述系统的开发人员交谈过,但他们没有看到解决此问题的简单方法。

其他 GMP 系统/用户是否知道此问题?您如何处理此类溢出?

作为健全性检查,首先测试 7^7^7 的值,它应该是: 375982...32343

在 32 位系统上,例如查询?- X is 13^1150000000.产生这样的溢出。 YAP 给出的内容如下:



GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /opt/gupu/src/yap-6.3/narch-gupu2/yap...done.
(gdb) run -f
Starting program: /opt/gupu/src/yap-6.3/narch-gupu2/yap -f
YAP 6.3.2 (i686-linux): Sun Nov 11 04:19:37 CET 2012
?- X is 13^1150000000.

Program received signal SIGSEGV, Segmentation fault.
0x001638d8 in ?? () from /usr/lib/libgmp.so.3
(gdb) bt
#0  0x001638d8 in ?? () from /usr/lib/libgmp.so.3
#1  0x00164470 in __gmpn_mul_fft () from /usr/lib/libgmp.so.3
#2  0x001646c2 in __gmpn_mul_fft_full () from /usr/lib/libgmp.so.3
#3  0x00165f28 in __gmpn_sqr_n () from /usr/lib/libgmp.so.3
#4  0x0014b58b in __gmpz_n_pow_ui () from /usr/lib/libgmp.so.3
#5  0x0014c4a1 in __gmpz_pow_ui () from /usr/lib/libgmp.so.3
#6  0x080c4a1d in Yap_gmp_exp_int_int (i1=13, i2=1150000000) at ../C/gmp_support.c:939
#7  0x0815f9df in p_exp (t1=, t2=3082051592) at ../C/arith2.c:609
#8  0x080b1f19 in Eval (t=0) at ../C/eval.c:147
#9  0x080b2251 in p_is () at ../C/eval.c:186
#10 0x0806b56a in Yap_absmi (inp=0) at ../C/absmi.c:6912
#11 0x080b3655 in exec_absmi (top=) at ../C/exec.c:1002
#12 0x080b3b1f in do_goal (t=, CodeAdr=, arity=, 
    pt=0x0, top=1) at ../C/exec.c:1068
#13 0x080b3d1d in Yap_RunTopGoal (t=135918154) at ../C/exec.c:1291
#14 0x08061a6f in YAP_RunGoalOnce (t=135918154) at ../C/c_interface.c:2511
#15 0x0805c2f5 in do_top_goal (argc=2, argv=0xbffff4c4) at ../console/yap.c:84
#16 exec_top_level (argc=2, argv=0xbffff4c4) at ../console/yap.c:131
#17 main (argc=2, argv=0xbffff4c4) at ../console/yap.c:172
(gdb) 
  

编辑:对于 64 位系统也是如此;像这样:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.3.5)
Copyright (c) 1990-2012 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- X is 3445^2^62.
gmp: overflow in mpz type
Abort

However,

?- X is 2^2^63.
ERROR: Out of global stack
?- X is 2^2^62.
gmp: overflow in mpz type
Abort

从下面开始:

?- X is 2^2^36.
ERROR: Out of global stack
?- X is 2^2^37.
gmp: overflow in mpz type
Abort

因此,如果数字足够大,则 SWI 会检测到错误 - 因此可以由 SWI 处理(错误:消息由 SWI 处理)。


并不是真正的答案,而是 SWI-Prolog 的作用的解释。首先,它估计是否 可能会发生溢出。如果确定,则会在调用 GMP 之前引发错误。否则,它 依赖 GMP 分配挂钩并在失败时执行 longjmp()。它会跟踪哪个 为什么进行分配并释放为中止的 GMP 操作分配的内存。它 之所以能够做到这一点,是因为记忆永远不会永久受到 GMP 的控制。成功的结果 GMP 计算被复制到 Prolog 堆栈并受 Prolog 内存管理。

这曾经有效,但在最近的版本中不起作用。我怀疑 GMP 估计的大小 如果它知道这会失败,甚至不会调用 malloc() 挂钩。我所需要的只是一种方法来确保始终调用该钩子,即使该值大得离谱。任何大于 size_t 可以表示的东西都可以用 (size_t)-1 调用钩子。

附注由于复制到(较小的)Prolog 运行时堆栈,它的溢出比内存可以存储的要早得多。

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

GMP pow 中的溢出处理 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 自定义 dealloc 和 ARC (Objective-C)

    在我的 iPad 小应用程序中 我有一个使用观察者的 切换语言 功能 每个视图控制器在其期间都会向我的观察者注册自己viewDidLoad void viewDidLoad super viewDidLoad observer regist
  • 如何检查函数模板是否已专门化?

    有没有办法在编译时确定某个函数模板是否是专门的 例如 假设有以下函数模板 template
  • 'selenium.common.exceptions.WebDriverException:消息:无法访问 u'chrome

    我正在使用 webdriver 来配置路由器 但是当我运行脚本时 from selenium import webdriver self driver webdriver Chrome 它打开chrome并且没有响应 然后引发异常 铬无法到
  • Scala 中的平等关系

    我刚刚偶然发现了托尼 莫里斯的一张关于 Java 的博客文章该语言的一个基本问题是 为集合定义定制的相等关系 我认为这是一个big deal并想知道是否有一些 scala 解决方案 这个经典问题体现在对交易的思考中 假设我以 150p 的价
  • WPF 命令和事件有什么区别?

    WPF 和 WPF 有什么区别Command and Event 一般来说 您可以对事件执行与命令几乎相同的操作 只是处理用户交互的模式不同 Commands在 WPF 中 允许您将命令处理程序的实现移至业务层 命令结合了启用状态和执行 因
  • Ember:嵌套组件事件冒泡

    我创建了一组嵌套组件 代码在这里 http emberjs jsbin com hasehija 2 edit HTML level 1 level 2 level 3
  • String.Format 一个整数以在丹麦文化中使用带有小数值的千位分隔符

    我有一根绳子totalPRice它的值是这样的1147 5我想要两件事 1 对值进行四舍五入 以便后面始终有两位数 2 在此字符串中实现千位分隔符 这样最终的输出将是这样的1 147 50我尝试过这样的事情 String Format 0
  • 使用 htaccess 将子目录重定向到子域

    我对使用 htaccess 比较陌生 除了我在网上阅读的内容之外 从未做过任何编码 我正在使用 Bluehost 并且我想将我的博客子目录重定向到子域 示例 我想将 www example com blog 重定向到 blog exampl
  • 使用 HttpContextScoped() 时 StructureMap 不会处理数据上下文

    我的目标是拥有一个数据上下文 MainDbContext ASP NET MVC 中的每个 HTTP 请求 并在请求结束时处理数据上下文 我正在使用以下 StructureMap 配置 public static class Contain
  • 连接文件与路径以获得C中的完整路径

    使用 C 我尝试将目录中的文件名与其路径连接起来 以便我可以为每个文件调用 stat 但是当我尝试在循环内使用 strcat 时 它将前一个文件名与下一个文件名连接起来 它在循环期间修改argv 1 但我已经很长时间没有使用C了 所以我很困
  • 为 PHP 数组的每一项添加前缀

    我有一个 PHP 数字数组 我想在其前面加上减号 我认为通过使用爆炸和内爆这是可能的 但我对 php 的了解不可能真正做到这一点 任何帮助 将不胜感激 本质上我想从这里开始 array 1 2 3 4 5 to this array 1 2
  • 在 MySQL 中存储时间间隔值的最佳方法?

    愚蠢的简单问题 但我一直无法找到一个优雅的解决方案 我想将时间间隔存储在 MySQL 列中 例如 1 40 1小时40分钟 0 30 30 分钟 然后能够运行查询并对它们求和 现在我将它们存储为 INT 值 1 40 但我必须手动进行加法
  • Numpy 数组每个项的均值和标准差

    我有一个二维数组 相同形状 的列表 并且希望在与输入形状相同的结果数组中获取所有项的平均值和偏差 我很难从文档中了解这是否可能 我对 axis 和 keepdims 参数的所有尝试都会产生不同形状的结果 例如 我希望有 mean x x 等
  • 使用 Hibernate (JPA) 查询 Postgresql 找不到表

    我正在使用 JPA 与 Hibernate 和 Postgresql 开发一个应用程序 使用 Netbeans 向导 我从现有数据库创建了实体类 其中一个类的摘录如下 Entity Table name ADM TYPES XmlRootE
  • 更改数据库中所有存储过程的 ANSI_NULLS 设置

    我们在 ANSI NULLS 设置和计算列方面存在一些问题 并且我们有大量的存储过程 SET ANSI NULLS OFF 我们想把它们全部改成 SET ANSI NULLS ON 有没有一种简单的方法可以做到这一点 或者我必须将所有 SP
  • 如何使用 dart_pdf 将资产图像和图标转换为 flutter 中的 PdfImage

    使用的库 dart pdf搜索后我发现同样的问题GITHUB但无法解决问题 我尝试了这个 但出现了模糊的图像 请帮忙 ByteData data await rootBundle load assets test jpg var codec
  • 改变iphone sdk中图像的颜色

    我有一个图像 我想通过编程更改该图像的颜色 我想改变这张图片的颜色 UPDATE 使用这个方法 UIImage imageNamed NSString name withColor UIColor color load the image
  • Rails flash[:notice] 总是 nil

    我不明白为什么我的 Rails 视图无法识别 flash notice 或 flash error 关于渲染的部分视图 我不断收到以下错误 具体错误是 ActionView Template Error 当你没有预料到时 你得到了一个 ni
  • 在每个文档中构建具有附加字段的反应式出版物

    我想制作一个包含几个附加字段的出版物 但我不想使用Collection aggregate当集合发生变化时 我的出版物更新就会丢失 所以我不能只使用self added在其中 我打算使用Cursor observeChanges为了实现这一
  • GMP pow 中的溢出处理

    我只是 GMP 库的间接用户 主要通过swi prolog and yap 但我对解决这个问题非常感兴趣 当使用大得离谱的值执行求幂时 主机系统或 GMP 不再能够适当地处理溢出 我已经与上述系统的开发人员交谈过 但他们没有看到解决此问题的