【发布时间】:2022-01-18 18:25:40
【问题描述】:
发生了什么事??
测试 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
【问题讨论】:
-
-3.67394039744e-16够接近了吧? -
您知道转换为弧度时会出现舍入误差,是吗?
-
你想了解一些浮点错误。
-
计算机尝试使用有限数量的二进制数字来表示无限范围的浮点数。这导致了 desimusxvil 提到的 Goldberg 的论文中很好地描述的问题。这也导致了计算机科学中的这个寓言:“对于足够大的 1,1 + 1 等于 3。”
标签: python math trigonometry