函数返回的结果为0.001

时间:2017-11-08 19:14:12

标签: python python-3.x

TL; DR :返回的浮动值已被0.0001关闭。我的函数实现是否会导致这种情况,或者仅仅是浮动值和计算机科学的奇迹,因为并非所有值都可以相应地表示?我不认为这是后者,所以我想知道是否有人可以发现问题,提出建议或让我尝试调试。

我写了两个函数来确定地球表面多边形的质心。

第一个函数计算两个顶点之间的方位。它会这样做两次,一次是UR到LL,一次是LR到UL。

第二个函数计算交叉点,给出两个先前计算的方位和每个计算的起点。 UR&它的轴承和LR&它的方位。

我的结果在经度上略有下降。例如,我向interest()提供:

x1 = 120.6272
y1 = 36.9647
x2 = 120.6128
y2 = 36.9508
b1 = 265.02976409662136
b2 = 354.4744218802173

我的结果是[36.96359071593996, 120.61125138605212]。纬度已更正,但经度应为120.61135138605212

方程式从here转录而来。有一个计算器,您可以在“两个路径的交点”部分下提供小数度和轴承,以查看预期结果。从DMS转换为DD时,此结果与ArcGIS中由同一多边形执行的质心计算的结果一致。我知道一个gisstackexchange,但是我没有关注这个问题的GIS部分。相反,我的问题在于:

问题:

使用我目前的实现,是存储功能[即cos = math.cos],本地使用平方[即x ** 2 vs math.pow()]或其他我不知道导致浮动的小数位有多少(0.0001对我来说很重要)?

承担功能

def bearing(x1, y1, x2, y2):

    cos = math.cos
    sin = math.sin
    atan2 = math.atan2
    rad = math.radians
    deg = math.degrees

    rx1 = rad(x1)
    ry1 = rad(y1)
    rx2 = rad(x2)
    ry2 = rad(y2)

    b = atan2(sin(rx2-rx1) * cos(ry2),
              cos(ry1) * sin(ry2) - (sin(ry1) * cos(ry2) * cos(rx2-rx1)))

    return ((deg(b) + 360) % 360) # normalize to -180...+180

相交功能

def intersect(x1, y1, b1, x2, y2, b2):

    cos = math.cos
    sin = math.sin
    atan2 = math.atan2
    asin = math.asin
    acos = math.acos

    sqrt = math.sqrt

    rad = math.radians
    deg = math.degrees
    pi = math.pi

    rx1 = rad(x1)
    ry1 = rad(y1)
    rx2 = rad(x2)
    ry2 = rad(y2)
    rb1 = rad(b1)
    rb2 = rad(b2)

    dx = rx2 - rx1
    dy = ry2 - ry1

    # Angular dist x1,y1 to x2,y2
    a12 = 2 * asin(sqrt((sin(dy/2)**2) +
                        (cos(ry1) * cos(ry2) * (sin(dx/2)**2))))

    # Initial bearing from x1,y1 to x2,y2
    bi = acos((sin(ry2) - (sin(ry1) * cos(a12))) / (sin(a12) * cos(ry1)))

    if math.isnan(bi):
        bi = 0

    # Final bearing
    bf = acos((sin(ry1) - (sin(ry2) * cos(a12))) / (sin(a12) * cos(ry2)))

    if (dx) > 0:
        # Bearing from x1,y1 to x2,y2
        b12 = bi
        # Bearing from x2,y2 to x1,y1
        b21 = (2 * pi) - bf
    else:
        b12 = (2 * pi) - bi
        b21 = bf

    # Angle x2,y2 -> x1,y1 -> x3,y3
    n1 = rb1 - b12

    # Angle x1,y1 -> x2,y2 -> x3,y3
    n2 = b21 - rb2

    n3 = acos(-(cos(n1) * cos(n2)) +
              (sin(n1) * sin(n2) * cos(a12)))

    # Angular dist x1,y1 to x3,y3
    a13 = atan2(sin(a12) * sin(n1) * sin(n2),
                cos(n2) + (cos(n1) * cos(n3)))

    # Latitude
    ry3 = asin((sin(ry1) * cos(a13)) +
               (cos(ry1) * sin(a13) * cos(rb1)))

    # Longitude Delta from x1 to x3
    dx13 = atan2(sin(rb1) * sin(a13) * cos(ry1),
                 cos(a13) - (sin(ry1) * sin(ry3)))

    # Longitude
    rx3 = rx1 + dx13

    return [deg(ry3), (deg(rx3) + 540) % 360 - 180]

1 个答案:

答案 0 :(得分:0)

你在每个函数中做的最后一件事是以有损方式从弧度转换为度。 尝试使用相同的代码但不在每个返回行中进行舍入:例如

return deg(b)

而不是

return ((deg(b) + 360) % 360)