Issue1880

Created on **2008-01-21 02:58** by **LambertDW**, last changed **2008-01-21 10:10** by **georg.brandl**. This issue is now **closed**.

Messages (3) | |||
---|---|---|---|

msg61374 - (view) | Author: David W. Lambert (LambertDW) | Date: 2008-01-21 02:58 | |

Please generalize math.hypot. While I don't have a survey of python codes, it seems to me unlikely for this change to break existing programs. import math def hypot(*args): ''' Return the Euclidean vector length. >>> from math import hypot, sqrt >>> hypot(5,12) # traditional definition 13.0 >>> hypot() 0.0 >>> hypot(-6.25) 6.25 >>> hypot(1,1,1) == sqrt(3) # diagonal of unit box True ''' return math.sqrt(sum(arg*arg for arg in args)) I propose this version as closest to: >>> print sys.version 2.5.1 (r251:54863, Jan 4 2008, 17:15:14) [GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] >>> print math.hypot.__doc__ hypot(x,y) Return the Euclidean distance, sqrt(x*x + y*y). Thanks, Dave. PS. I don't understand why python is so restrictive. Although hypot is in the math library, it could be written in EAFP style as def hypot(*args): return sum(arg*arg for arg in args)**0.5 Rather than review the entire python library for items to generalize, I'll accept that the resulting errors would confuse "the penguin on my tele". "hypot" crosses me most often. I've not yet needed a version in the complex domain, such as my second version. I typically fill my need for length with scipy.sqrt(scipy.dot(v,v)), only to realize that for the short vectors I use, standard python constructs always perform faster than scipy |
|||

msg61377 - (view) | Author: Mark Dickinson (mark.dickinson) * | Date: 2008-01-21 04:33 | |

I'm not sure either that such a generalization would belong in math (which right now does little more than expose some basic functions from the C library) or that it should be called hypot. It seems to me that this would belong with other vector-type math stuff, but there isn't any of that in core Python or the libraries at the moment. On one hand, this falls foul of the 'not every one-liner should be a builtin' rule. On the other hand, it's not a one-liner if done properly: compare the output of math.hypot(1e160, 1e160) with the output of your version. Similarly for math.hypot(1e-160, 1e-160). |
|||

msg61380 - (view) | Author: Georg Brandl (georg.brandl) * | Date: 2008-01-21 10:10 | |

IOW, this is rejected. |

History | |||
---|---|---|---|

Date | User | Action | Args |

2008-01-21 10:10:22 | georg.brandl | set | status: open -> closed resolution: rejected messages: + msg61380 nosy: + georg.brandl |

2008-01-21 04:33:23 | mark.dickinson | set | priority: low nosy: + mark.dickinson messages: + msg61377 |

2008-01-21 02:58:51 | LambertDW | create |