This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2011年07月19日 21:40 by rpointel, last changed 2022年04月11日 14:57 by admin.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| pyconfig.h | landry, 2011年08月07日 09:08 | openbsd/macppc pyconfig for python 3.2.1 | ||
| math.h | landry, 2011年08月07日 09:08 | openbsd/macppc math.h | ||
| pyconfig.h.wrong | landry, 2011年08月07日 10:16 | broken pyconfig.h | ||
| build-macppc.log | landry, 2011年08月07日 10:17 | python 3.2.1 failing build log | ||
| Messages (21) | |||
|---|---|---|---|
| msg140697 - (view) | Author: Remi Pointel (rpointel) * | Date: 2011年07月19日 21:40 | |
Hello, the test test_nan_inf failed on OpenBSD on powerpc architecture. It works fine on amd64 and sparc64. Don't hesitate if you need more informations. Details: Re-running test 'test_long' in verbose mode test__format__ (test.test_long.LongTest) ... ok test_bit_length (test.test_long.LongTest) ... ok test_bitop_identities (test.test_long.LongTest) ... ok test_conversion (test.test_long.LongTest) ... ok test_correctly_rounded_true_division (test.test_long.LongTest) ... ok test_division (test.test_long.LongTest) ... ok test_float_conversion (test.test_long.LongTest) ... ok test_float_overflow (test.test_long.LongTest) ... ok test_format (test.test_long.LongTest) ... ok test_from_bytes (test.test_long.LongTest) ... ok test_karatsuba (test.test_long.LongTest) ... ok test_logs (test.test_long.LongTest) ... ok test_long (test.test_long.LongTest) ... ok test_mixed_compares (test.test_long.LongTest) ... ok test_nan_inf (test.test_long.LongTest) ... FAIL test_round (test.test_long.LongTest) ... ok test_small_ints (test.test_long.LongTest) ... ok test_to_bytes (test.test_long.LongTest) ... ok test_true_division (test.test_long.LongTest) ... /usr/obj/ports/Python-3.2.1/Python-3.Lib/test/regrtest.py:1053: ResourceWarning: unclosed <socket.socket object, fd=11, family=2, type=1, proto=0> gc.collect() /usr/obj/ports/Python-3.2.1/Python-3.Lib/test/regrtest.py:1053: ResourceWarning: unclosed <socket.socket object, fd=12, family=2, type=1, proto=0> gc.collect() /usr/obj/ports/Python-3.2.1/Python-3.Lib/test/regrtest.py:1053: ResourceWarning: unclosed <socket.socket object, fd=13, family=2, type=1, proto=0> gc.collect() test test_long failed ok ====================================================================== FAIL: test_nan_inf (test.test_long.LongTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/obj/ports/Python-3.2.1/Python-3.Lib/test/test_long.py", line 633, in test_nan_inf self.assertRaises(OverflowError, int, float('inf')) AssertionError: OverflowError not raised by int ---------------------------------------------------------------------- Ran 19 tests in 25.020s FAILED (failures=1) |
|||
| msg140698 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月19日 21:50 | |
What is the result of int(float('inf')) ?
|
|||
| msg140758 - (view) | Author: Landry Breuil (landry) | Date: 2011年07月20日 17:58 | |
$python3.2
Python 3.2.1 (default, Jul 18 2011, 10:56:33)
[GCC 4.2.1 20070719 ] on openbsd4
>>> int(float('inf'))
0
$sysctl hw
hw.machine=macppc
|
|||
| msg140803 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月21日 10:05 | |
Is HAVE_DECL_ISINF defined in pyconfig.h? PyLong_FromDouble() uses Py_IS_INFINITY(x): -------------------------------------- /* Py_IS_INFINITY(X) * Return 1 if float or double arg is an infinity, else 0. * Caution: * X is evaluated more than once. * This implementation may set the underflow flag if |X| is very small; * it really can't be implemented correctly (& easily) before C99. * Override in pyconfig.h if you have a better spelling on your platform. * Py_FORCE_DOUBLE is used to avoid getting false negatives from a * non-infinite value v sitting in an 80-bit x87 register such that * v becomes infinite when spilled from the register to 64-bit memory. * Note: PC/pyconfig.h defines Py_IS_INFINITY as _isinf */ #ifndef Py_IS_INFINITY # if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 # define Py_IS_INFINITY(X) isinf(X) # else # define Py_IS_INFINITY(X) ((X) && \ (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) # endif #endif -------------------------------------- main() in Modules/python.c starts with: -------------------------------------- /* 754 requires that FP exceptions run in "no stop" mode by default, * and until C vendors implement C99's ways to control FP exceptions, * Python requires non-stop mode. Alas, some platforms enable FP * exceptions by default. Here we disable them. */ #ifdef __FreeBSD__ fp_except_t m; m = fpgetmask(); fpsetmask(m & ~FP_X_OFL); #endif -------------------------------------- You may try to enable this code on OpenBSD, replace "#ifdef __FreeBSD__" by "#if 1". Can you also please try the following code? $ python >>> import struct >>> struct.pack("f", float("inf")) b'\x00\x00\x80\x7f' |
|||
| msg140817 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2011年07月21日 12:57 | |
The result of:
struct.pack("d", float("inf"))
would also be interesting. I'd expect to see:
'\x7f\xf0\x00\x00\x00\x00\x00\x00'
|
|||
| msg140825 - (view) | Author: Landry Breuil (landry) | Date: 2011年07月21日 19:22 | |
>>> import struct
>>> struct.pack("d", float("inf"))
b'\x7f\xf0\x00\x00\x00\x00\x00\x00'
>>> struct.pack("f", float("inf"))
b'\x7f\x80\x00\x00'
And yes, HAVE_DECL_ISINF is defined to 1 in pyconfig.h
|
|||
| msg140836 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月21日 23:29 | |
You may try:
$ ./python
>>> import ctypes
>>> import ctypes.util
>>> libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))
>>> isinf = libc.isinf
>>> isinf.argtypes = (ctypes.c_double,)
>>> isinf(0.0)
0
>>> isinf(float('inf'))
1
(try ctypes.util.find_library('m') if isinf is not in libc)
|
|||
| msg140863 - (view) | Author: Landry Breuil (landry) | Date: 2011年07月22日 05:23 | |
Python 3.2.1 (default, Jul 18 2011, 10:56:33)
[GCC 4.2.1 20070719 ] on openbsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> import ctypes.util
>>> libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))
>>> isinf = libc.isinf
>>> isinf.argtypes = (ctypes.c_double,)
>>> isinf(0.0)
0
>>> isinf(float('inf'))
1
|
|||
| msg140865 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月22日 10:08 | |
The problem is in PyLong_FromDouble(): if (Py_IS_INFINITY(dval)) is evaluated as false, whereas dval *is* infinity. Possible causes:
- Py_IS_INFINITY is not defined as "# define Py_IS_INFINITY(X) isinf(X)" (issue with the pyconfig.h file?)
- the compiler replaces isinf(X) by something else (!?)
- isinf() is not called with the right argument (conversion between 32, 64 and/or 80 floats?)
- issue with the FPU mode (unlikely because in your ctypes test, isinf(float("inf")) returns 1, and this test runs in the Python process)
Try to run python in gdb. Set a breakpoint on isinf() (or on PyLong_FromDouble() and use step by step) to check that the function is really called, and called with the "right" argument.
You may also try to replace Py_IS_INFINITY(dval) directly by isinf(dval) (or simply if(1) :-)) in PyLong_FromDouble().
|
|||
| msg140884 - (view) | Author: Landry Breuil (landry) | Date: 2011年07月22日 15:01 | |
$grep -r '#define Py_IS_INF' . PC/pyconfig.h:#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) >>> isinf(float('inf')) Breakpoint 2, __isinf (d=1.0604798301039825e-314) at /usr/src/lib/libc/gen/isinf.c:30 30 in /usr/src/lib/libc/gen/isinf.c (gdb) bt #0 __isinf (d=1.0604798301039825e-314) at /usr/src/lib/libc/gen/isinf.c:30 #1 0x8fe528d8 in ffi_call_SYSV () from /usr/local/lib/libffi.so.0.0 |
|||
| msg140886 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2011年07月22日 15:14 | |
The '1.06...e-314' number in the gdb output is interesting: it indicates a byte-ordering issue, though maybe that issue is only pertinent to gdb itself.
On a little-endian machine:
>>> struct.pack('<d', 1.0604798301039825e-314)
'\x00\x00\xf0\x7f\x00\x00\x00\x00'
>>> struct.pack('<d', float('inf'))
'\x00\x00\x00\x00\x00\x00\xf0\x7f'
Same bytes, different order. This may indicate some kind of float / double mismatch somewhere, or a byte-ordering issue.
|
|||
| msg140887 - (view) | Author: Mark Dickinson (mark.dickinson) * (Python committer) | Date: 2011年07月22日 15:21 | |
Question: does this test also fail after configuring with the --with-pydebug flag? (Which I *think* should turn compiler optimizations off, amongst other things.) |
|||
| msg140889 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月22日 15:28 | |
> $grep -r '#define Py_IS_INF' . > PC/pyconfig.h:#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) The PC/ directory is specific to Windows. Py_IS_INFINITY should be defined in Include/pymath.h (at least, in the 3.2 branch) > Breakpoint 2, __isinf (d=1.0604798301039825e-314) > ... > #1 0x8fe528d8 in ffi_call_SYSV () from /usr/local/lib/libffi.so.0.0 Ah, you ran gdb on ctypes. I forgot to specify that you should run gdb on "int(float('inf'))" instruction in Python, sorry. I would like to check int(float), not ctypes ;-) If gdb has an endian issue, you may also try "print /x d" in the gdb shell. Example on x86_64: --------------------------------------------- $ gdb ./python GNU gdb (GDB) 7.1-ubuntu ... (gdb) run <press ^C> (gdb) b isinf Breakpoint 1 at 0xb7f94f16: file ../sysdeps/ieee754/dbl-64/s_isinf.c, line 23. (2 locations) (gdb) cont >>> int(float('inf')) Breakpoint 1, *__GI___isinf (x=inf) at ../sysdeps/ieee754/dbl-64/s_isinf.c:23 23 ../sysdeps/ieee754/dbl-64/s_isinf.c: Aucun fichier ou dossier de ce type. in ../sysdeps/ieee754/dbl-64/s_isinf.c (gdb) print /x x 1ドル = 0x8000000000000000 (gdb) where #0 *__GI___isinf (x=inf) at ../sysdeps/ieee754/dbl-64/s_isinf.c:23 #1 0x0819b03e in PyLong_FromDouble (dval=inf) at Objects/longobject.c:280 #2 0x0818d660 in float_trunc (v=<float at remote 0x826fb44>) at Objects/floatobject.c:896 #3 0x081619c6 in PyNumber_Long (o=<float at remote 0x826fb44>) at Objects/abstract.c:1348 #4 0x081a4823 in long_new (type=0x824b420, args=(<float at remote 0x826fb44>,), kwds=0x0) at Objects/longobject.c:4130 ... (gdb) frame 1 #1 0x0819b03e in PyLong_FromDouble (dval=inf) at Objects/longobject.c:280 280 if (Py_IS_INFINITY(dval)) { (gdb) print /x dval 2ドル = 0x8000000000000000 --------------------------------------------- |
|||
| msg140890 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月22日 15:30 | |
> If gdb has an endian issue, > you may also try "print /x d" in the gdb shell. Oh, forget me: /x converts the argument to an integer... |
|||
| msg140891 - (view) | Author: Landry Breuil (landry) | Date: 2011年07月22日 15:47 | |
Py_IS_INFINITY is defined as
#ifndef Py_IS_INFINITY
# if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1
# define Py_IS_INFINITY(X) isinf(X)
# else
# define Py_IS_INFINITY(X) ((X) && \
(Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X)))
# endif
#endif
The test still fails when built --with-pydebug.
(gdb) b isinf
Function "isinf" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (isinf) pending.
(gdb) r
Starting program: /usr/obj/ports/Python-3.2.1/Python-3.2.1/python
Breakpoint 2 at 0x852786d4: file /usr/src/lib/libc/gen/isinf.c, line 27.
Pending breakpoint "isinf" resolved
Python 3.2.1 (default, Jul 22 2011, 17:34:54)
[GCC 4.2.1 20070719 ] on openbsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> int(float('inf'))
0
[56408 refs]
isinf is #defined in math.h to
#define isinf(x) \
((sizeof (x) == sizeof (float)) ? \
__isinff(x) \
: (sizeof (x) == sizeof (double)) ? \
__isinf(x) \
: __isinfl(x))
but setting a bkp on it changes nothing.
Starting program: /usr/obj/ports/Python-3.2.1/Python-3.2.1/python
Breakpoint 2 at 0x89b4f708: file /usr/src/lib/libc/gen/isinf.c, line 36.
Pending breakpoint "__isinff" resolved
Python 3.2.1 (default, Jul 22 2011, 17:34:54)
[GCC 4.2.1 20070719 ] on openbsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> int(float('inf'))
0
Setting a bkp on PyLong_FromDouble() shows that it's not called.
Sorry, this doesnt make sense to me...
|
|||
| msg140894 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年07月22日 16:04 | |
I'm not sure that your version of gdb understands macros. You may have to set a breakpoint on __isinf. Compile Python with "-g -ggdb" helps gdb. Py_IS_INFINITY is may not defined as "# define Py_IS_INFINITY(X) isinf(X)". To check that, add #error macro in pymath.h for all cases around #ifndef Py_IS_INFINITY. For example: #ifndef Py_IS_INFINITY # if defined HAVE_DECL_ISINF && HAVE_DECL_ISINF == 1 # error "Py_IS_INFINITY is implemented using isinf()" # define Py_IS_INFINITY(X) isinf(X) # else # error "Py_IS_INFINITY is implemented using *0.5" # define Py_IS_INFINITY(X) ((X) && \ (Py_FORCE_DOUBLE(X)*0.5 == Py_FORCE_DOUBLE(X))) # endif #else # error "Py_IS_INFINITY already set!?" #endif And recompile Python. It may be a typo in pyconfig.h (generated by configure) or an issue with the inclusion paths of gcc (-I options). Can you please attach your pyconfig.h and /usr/include/math.h files? Can you also copy-paste the line used to compile Object/floatobject.c (to check the compiler options)? Use touch Object/floatobject.c && make to recompile this file. FYI, isinf() is also a macro on Linux: # ifdef __NO_LONG_DOUBLE_MATH # define isinf(x) \ (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x)) # else # define isinf(x) \ (sizeof (x) == sizeof (float) \ ? __isinff (x) \ : sizeof (x) == sizeof (double) \ ? __isinf (x) : __isinfl (x)) # endif |
|||
| msg141741 - (view) | Author: Landry Breuil (landry) | Date: 2011年08月07日 09:07 | |
floatobject.c is compiled with cc -pthread -c -fno-strict-aliasing -O2 -pipe -Wall -DTHREAD_STACK_SIZE=0x20000 -fPIC -O2 -pipe -Wall -I. -IInclude -I./Include -fPIC -DPy_BUILD_CORE -o Objects/floatobject.o Objects/floatobject.c |
|||
| msg141742 - (view) | Author: Landry Breuil (landry) | Date: 2011年08月07日 10:16 | |
Interestingly, after an update of the system i can't build python 3.2.1 anymore : /usr/include/util.h:102: error: conflicting types for 'openpty' Include/pyport.h:634: error: previous declaration of 'openpty' was here /usr/include/util.h:105: error: conflicting types for 'forkpty' Include/pyport.h:635: error: previous declaration of 'forkpty' was here ./Modules/posixmodule.c: In function 'posix_lstat': ./Modules/posixmodule.c:5155: error: 'lstat' undeclared (first use in this function) ./Modules/posixmodule.c:5155: error: (Each undeclared identifier is reported only once ./Modules/posixmodule.c:5155: error: for each function it appears in.) Relevant lines of configure output (so those seem to come from systemwide config.site) : checking for lstat... (cached) yes checking for openpty... (cached) no checking for openpty in -lutil... (cached) yes checking for forkpty... yes I'm attaching the generated pyconfig.h and the build log, but now that seems to be a different issue.. as pyconfig.h clearly contains wrong defs. Don't count on me too much for that issue, i have honestly no interest in python and lost enough time on that... i trust remi to pick up on it :) |
|||
| msg142743 - (view) | Author: Remi Pointel (rpointel) * | Date: 2011年08月22日 19:43 | |
Hi, what information do you need to advance on this bug? Cheers, Remi. |
|||
| msg143186 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年08月29日 22:03 | |
> what information do you need to advance on this bug? It would be easier to debug if I had access to OpenBSD on a PowerPC host. |
|||
| msg221768 - (view) | Author: Mark Lawrence (BreamoreBoy) * | Date: 2014年06月28日 02:13 | |
Can this be reproduced on 3.4/5? |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:19 | admin | set | github: 56798 |
| 2019年03月16日 00:00:24 | BreamoreBoy | set | nosy:
- BreamoreBoy |
| 2014年06月28日 02:13:08 | BreamoreBoy | set | versions:
+ Python 3.4, Python 3.5, - Python 3.2 nosy: + BreamoreBoy messages: + msg221768 type: behavior |
| 2011年08月29日 22:03:14 | vstinner | set | messages: + msg143186 |
| 2011年08月22日 19:43:44 | rpointel | set | messages: + msg142743 |
| 2011年08月07日 10:17:24 | landry | set | files: + build-macppc.log |
| 2011年08月07日 10:16:53 | landry | set | files:
+ pyconfig.h.wrong messages: + msg141742 |
| 2011年08月07日 09:08:59 | landry | set | files: + math.h |
| 2011年08月07日 09:08:39 | landry | set | files: + pyconfig.h |
| 2011年08月07日 09:07:30 | landry | set | messages: + msg141741 |
| 2011年07月22日 16:04:25 | vstinner | set | messages: + msg140894 |
| 2011年07月22日 15:47:49 | landry | set | messages: + msg140891 |
| 2011年07月22日 15:30:16 | vstinner | set | messages: + msg140890 |
| 2011年07月22日 15:28:02 | vstinner | set | messages: + msg140889 |
| 2011年07月22日 15:21:36 | mark.dickinson | set | messages: + msg140887 |
| 2011年07月22日 15:14:49 | mark.dickinson | set | messages: + msg140886 |
| 2011年07月22日 15:01:57 | landry | set | messages: + msg140884 |
| 2011年07月22日 10:08:11 | vstinner | set | messages: + msg140865 |
| 2011年07月22日 05:23:07 | landry | set | messages: + msg140863 |
| 2011年07月21日 23:29:11 | vstinner | set | messages: + msg140836 |
| 2011年07月21日 19:22:00 | landry | set | messages: + msg140825 |
| 2011年07月21日 12:57:29 | mark.dickinson | set | messages: + msg140817 |
| 2011年07月21日 10:05:52 | vstinner | set | messages: + msg140803 |
| 2011年07月21日 09:45:12 | vstinner | set | nosy:
+ mark.dickinson |
| 2011年07月20日 17:58:29 | landry | set | nosy:
+ landry messages: + msg140758 |
| 2011年07月19日 21:50:30 | vstinner | set | nosy:
+ vstinner messages: + msg140698 |
| 2011年07月19日 21:40:34 | rpointel | create | |