Mercurial > cpython-lru_cache-weakref
annotate Python/pymath.c @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | 3c9232a684ae |
| children |
| rev | line source |
|---|---|
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1 #include "Python.h" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
2 |
|
51485
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
3 #ifdef X87_DOUBLE_ROUNDING |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
4 /* On x86 platforms using an x87 FPU, this function is called from the |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
5 Py_FORCE_DOUBLE macro (defined in pymath.h) to force a floating-point |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
6 number out of an 80-bit x87 FPU register and into a 64-bit memory location, |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
7 thus rounding from extended precision to double precision. */ |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
8 double _Py_force_double(double x) |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
9 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
10 volatile double y; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
11 y = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
12 return y; |
|
51485
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
13 } |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
14 #endif |
|
f9f2ed79b00f
Merged revisions 69459 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
49270
diff
changeset
|
15 |
|
53240
28645a961004
The SSE2 detection and enabling could potentially cause
Mark Dickinson <dickinsm@gmail.com>
parents:
53223
diff
changeset
|
16 #ifdef HAVE_GCC_ASM_FOR_X87 |
|
53185
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
17 |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
18 /* inline assembly for getting and setting the 387 FPU control word on |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
19 gcc/x86 */ |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
20 |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
21 unsigned short _Py_get_387controlword(void) { |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
22 unsigned short cw; |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
23 __asm__ __volatile__ ("fnstcw %0" : "=m" (cw)); |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
24 return cw; |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
25 } |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
26 |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
27 void _Py_set_387controlword(unsigned short cw) { |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
28 __asm__ __volatile__ ("fldcw %0" : : "m" (cw)); |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
29 } |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
30 |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
31 #endif |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
32 |
|
97ae7a709c1d
Issue #1580: use short float repr where possible.
Mark Dickinson <dickinsm@gmail.com>
parents:
51485
diff
changeset
|
33 |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
34 #ifndef HAVE_HYPOT |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
35 double hypot(double x, double y) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
36 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
37 double yx; |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
38 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
39 x = fabs(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
40 y = fabs(y); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
41 if (x < y) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
42 double temp = x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
43 x = y; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
44 y = temp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
45 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
46 if (x == 0.) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
47 return 0.; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
48 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
49 yx = y/x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
50 return x*sqrt(1.+yx*yx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
51 } |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
52 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
53 #endif /* HAVE_HYPOT */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
54 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
55 #ifndef HAVE_COPYSIGN |
|
53223
8209b6c32e61
Merged revisions 71705 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53221
diff
changeset
|
56 double |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
57 copysign(double x, double y) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
58 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
59 /* use atan2 to distinguish -0. from 0. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
60 if (y > 0. || (y == 0. && atan2(y, -1.) > 0.)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
61 return fabs(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
62 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
63 return -fabs(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
64 } |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
65 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
66 #endif /* HAVE_COPYSIGN */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
67 |
|
53221
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
68 #ifndef HAVE_ROUND |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
69 double |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
70 round(double x) |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
71 { |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
72 double absx, y; |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
73 absx = fabs(x); |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
74 y = floor(absx); |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
75 if (absx - y >= 0.5) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
53240
diff
changeset
|
76 y += 1.0; |
|
53221
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
77 return copysign(y, x); |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
78 } |
|
c5c8680ee0b1
Add check for C99 round function to configure, and define
Mark Dickinson <dickinsm@gmail.com>
parents:
53185
diff
changeset
|
79 #endif /* HAVE_ROUND */ |
