【问题标题】:Python cos(90) and cos(270) not 0Python cos(90) 和 cos(270) 不是 0
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我不明白这怎么可能不在函数中?尚未阅读整篇论文,但看起来很有趣。
  • cos 不知道它的参数是 7/4pi 是否受到舍入误差的影响,或者你是否故意传递了那个“稍微错误”的值,它只是试图给你它的参数的余弦已收到。您始终可以在计算后对返回值进行四舍五入,但如果它自动四舍五入,则无法返回精度。
【解决方案2】:

确实,这是一个非常低的数字,非常接近于零。这是一篇很棒的文章,可以帮助您了解浮动的常见挑战和陷阱:“What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多