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 中的溢出处理 的相关文章

  • 不允许从函数返回函数。我怎么能?

    8 3 5 8 Functions dcl fct says 函数的返回类型不得为 类型数组或function 尽管它们可能具有指针类型的返回类型或对此类事物的引用 为什么规则这么明确 是否有某种语法甚至允许返回函数而不是函数指针 我是否误
  • WritePrivateProfileString 未在末尾添加属性

    我正在使用以下命令在 ini 文件中写入一些属性WritePrivateProfileString函数并且一切正常 但是当我添加多行文本时 出现了问题 这是代码和输出 WritePrivateProfileString T General
  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令
  • 如何从头开始重复C程序并清理屏幕和第一个输入值?

    我是编程新手 我写了一个简单的程序 我想一次又一次地重复该程序 并且只有当用户想要退出时它才能退出 这是我的程序 include
  • Windows 控制台中的 C++ 按键输入

    我目前正在开发各种consoleWindows 中的游戏无法通过常规输入真正运行cin 我怎样才能 以简单的方式仅使用 MSVC 中提供的标准 Windows 库 让程序等待 特定 按键并返回按键 ID 它必须适用于包括箭头键在内的所有按键
  • 当 TestCase 包含数组时,NUnit 无法识别该 TestCase

    这是我在 NUnit 中遇到的非常简单但烦人的行为 我有一些这样的测试 Test TestCase 1 2 hello TestCase 3 5 goodbye public void MyClass MyMethod int a int
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • 如何将整个流读入 std::string ?

    我正在尝试将整个流 多行 读入字符串中 我正在使用这段代码 它有效 但它冒犯了我的风格感 当然有更简单的方法吗 也许使用字符串流 void Obj loadFromStream std istream stream std string s
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • 弹出窗口或弹出窗口显示附加信息

    我想在我的应用程序顶部显示带有附加信息的弹出窗口 我的信息是Listview大约 500 个项目我都尝试过 有问题flyout gt 它里面可能有scrollViewer 所以我的列表视图不能正确虚拟化 其他一切都可以 有我的代码 Flyo
  • C memcpy 二维数组

    我正在尝试使用将一个二维数组复制到另一个memcpy 我的代码 include
  • 提取 zip 文件时 Parallel.ForEach 抛出异常

    我正在阅读 zip 文件的内容并尝试提取它们 var allZipEntries ZipFile Open zipFileFullPath ZipArchiveMode Read Entries 现在 如果我提取使用 Foreach 循环
  • MSAL.Net 没有帐户或登录提示传递到 AcquireTokenSilent 调用

    我见过很多相同或类似的问题 并尝试了他们所有的答案 如果有的话 但这些都不适合我 我在用着这个例子 https github com Azure Samples ms identity javascript angular spa aspn
  • 在源代码和预编译二进制文件之间切换

    我们的应用程序中有大量的库 库是用 C 或 C 编写的 平台 net Framework Windows 64 位 将所有内容编译为源代码需要花费大量时间 我们正在考虑切换到预构建的二进制文件 但我们仍然希望保留返回源代码的可能性 作为版本
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐

  • 自定义 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 不再能够适当地处理溢出 我已经与上述系统的开发人员交谈过 但他们没有看到解决此问题的