Python 处理(或通过传递)计算中的域错误

Python 处理(或通过传递)计算中的域错误,python,math,exception-handling,logarithm,Python,Math,Exception Handling,Logarithm,我使用了来自的一些代码,将纬度转换为“从南极到米” 两个单元测试将转换纬度-90,得到零,并转换纬度90,这将返回从南极到北极的子午线长度 问题在于公式的这一部分: from math import * my = log(tan((90 + lat) * pi/360.0)) / (pi/180.0) 因为当我输入-90的lat时,我得到: ValueError: math domain error 我想这与tan函数有关,因为它在pi/2 另一方面,如果我们“测量从南极的距离”,在我看来

我使用了来自的一些代码,将纬度转换为“从南极到米”

两个单元测试将转换纬度-90,得到零,并转换纬度90,这将返回从南极到北极的子午线长度

问题在于公式的这一部分:

from math import *

my = log(tan((90 + lat) * pi/360.0)) / (pi/180.0)
因为当我输入-90的lat时,我得到:

ValueError: math domain error
我想这与tan函数有关,因为它在
pi/2

另一方面,如果我们“测量从南极的距离”,在我看来,这似乎是直觉,它应该返回零

所以问题是:我应该如何以理智的方式修正这个公式

我相信这可能是一个常见的问题,但我从来没有遇到过这样的问题,我不知道我应该怎么做

更新:这解决了我目前的问题,但我想知道是否有一个更美好的方式:

    a = tan((90 + self._lat) * pi/360.0)
    b = 0 if a == 0 else log(a)
    c = b / (pi/180.0)
    my = (c * ORIGIN_SHIFT) /180.0

分别计算要发送到
log()
tan()
的表达式,然后如果它们无效(0或pi/2),手动将
my
设置为有用的值?@TigerhawkT3我这样做了,将更新问题。我仍然想知道这是通常的做法,还是有一种更“纯粹”的方法(理想情况下没有ifs)。如果你不关心最小的错误,你可以使用
log(tan((90+math.max(lat,-89.9999))*pi/360.0))
在一个完全三角问题中如何得到对数?这个公式不应该仅仅是从南极角度*地球半径吗?@LutzL也许我的简化解释是错误的。这个公式是地图投影(球形墨卡托投影,或“谷歌”投影)的一部分,所以我猜它更像是“纬度到像素”,然后是“到米”,因为在这个投影中,地图比例随纬度非线性变化。