處理(我只在GMP庫的間接用戶主要通過swi-prolog和yap,但我解決這個問題我很感興趣。)溢出GMP戰俘
當執行與大的離譜值指數運算,主機系統或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
然而,
?- 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處理(ERROR:消息由SWI處理)。
在最近的版本中,它打印出消息並中止。以這種方式,應用程序無法處理溢出。在這種情況下,SWI-Prolog – false
您是否試過了SWI-Prolog的64位版本? –
是的 - 見上面6.3.5剛出來不到一個小時... – false