5

到底是怎么回事??

测试 sin 和 cos 函数,以找出为什么在将坐标输出到 SVG 文件时,我在错误的位置得到如此漂亮的定位。所以我做了这个测试代码,我可以预测答案是什么,找出原因。奇怪的是,没有任何影响它自己计算的行为,而只是我将要停留的位置。如果 position 为 0 并且计算后会变为 0 则不起作用,但如果 position 为 1 并且会在计算后变为 1 则有效。

第一次测试:

import math

cX = 2
cY = 2
r = 2

rcX = cX + (r * math.cos(math.radians(0)))
rcY = cY + (r * math.sin(math.radians(0)))

print rcX #4
print rcY #2
r = 1

rlX = rcX + (r * math.cos(math.radians(90)))
rlY = rcY + (r * math.sin(math.radians(90)))

print rlX #4
print rlY #3
r = 4

flX = rlX + (r * math.cos(math.radians(180)))
flY = rlY + (r * math.sin(math.radians(180)))

print flX #0
print flY #3
r = 2

print r * math.cos(math.radians(270))
print flX + (r * math.cos(math.radians(270))) #-3.67394039744e-16 should be 0
print flY + (r * math.sin(math.radians(270))) #1

现在我将 cX 更改为 3,即使它不影响计算,它也可以工作:

r * math.cos(math.radians(270))

该计算的结果被添加到 x 坐标

import math

cX = 3
cY = 2
r = 2

rcX = cX + (r * math.cos(math.radians(0)))
rcY = cY + (r * math.sin(math.radians(0)))

print rcX #5
print rcY #2
r = 1

rlX = rcX + (r * math.cos(math.radians(90)))
rlY = rcY + (r * math.sin(math.radians(90)))

print rlX #5
print rlY #3
r = 4

flX = rlX + (r * math.cos(math.radians(180)))
flY = rlY + (r * math.sin(math.radians(180)))

print flX #1
print flY #3
r = 2

print r * math.cos(math.radians(270))
print flX + (r * math.cos(math.radians(270))) #1
print flY + (r * math.sin(math.radians(270))) #1
4

3 回答 3

9

事实上,这是一个非常低的数字,非常接近于零。这是一篇很棒的文章,可以帮助您了解浮点数的常见挑战和陷阱:“每个计算机科学家应该了解的浮点运算知识

于 2012-11-06T22:20:47.430 回答
6

您正在处理舍入错误,这在处理浮点数学时(大部分)是不可避免的(请参阅其他人已经链接的论文以准确了解发生了什么)。

在许多情况下,您可以减少它们的影响(通过以“智能”顺序执行操作或以更“浮点友好”的方式重新制定表达式),但在您的情况下,最简单的做法是将结果四舍五入,例如6 位小数,并对此感到满意。当然,您不需要更精确的定位,并且您将获得“规范”角度的预期结果。

于 2012-11-06T22:19:45.060 回答
0

我今天必须使用 270 度的 cos、sin 和 tan 来完成一个项目。如果我没有用谷歌搜索结果来检查自己,我就不会知道有错误。(我知道无缘无故地将度数设为常数只是将其变成弧度是荒谬的,这就是他们想要的项目。)

只要我先将弧度四舍五入,cos 和 sin 就为我工作,但 tan 离我很远。

我通过手动进行数学运算并捕获无法除以 0 的错误并将其设置为未定义来修复切线:

    #variables for various trigonometric functions (sine, cosine and tangent) of 270 degrees
    DEGREE = 270
    RADIAN = round(m.radians(DEGREE), 3) #the degree has to be converted to a radian to input into the math.cos and math.sin functions
    COS = round(m.cos(RADIAN), 2) #pass the radian to get the cosine
    SIN = round(m.sin(RADIAN), 2) #pass the radian to get the sine

    try:
         # the math library did not return the correct answer for tangent when dividing by 0
         # so, I manually did the math, this catches the division by zero and correctly labels the tangent
         # as undefined
        tan = round(SIN/COS, 2)
        
    except:
        tan = "Undefined"

    print("\n\nMathematical Constants") #display a title for the list

    #headers list for each function
    headers = ["Pi", "e", "Sine(270\u00b0)", "Cosine(270\u00b0)", "Tangent(270\u00b0)"]
    #list of each constant
    dataList = [round(m.pi, 2), round(m.e, 2), SIN, COS , tan]

    #looping iterator to diplay each function
    i = 0
    while i < len(headers):
        print("------")
        print(headers[i] + ": " + str(dataList[i]))

        i += 1 #increase iterator by one
于 2022-01-15T04:38:56.520 回答