Python cos(90) and cos(270) not 0

2019-01-12 07:35发布

What is going on??

Testing out sin and cos functions to find out why I get so beautiful positioning on the wrong places when outputting my coordinates into a SVG file. So I made this test code, which I can predict what the answer is to find out why. Oddly nothing that effects the calculation it self adds this behavior but simply the position of where I'm about to stay. If the position is 0 and will become 0 after the calculation it won't work, but if position is 1 and will become 1 after the calculation it works.

First Test:

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

Now I change cX to 3 and it works even if it doesn't effect the calculation which is:

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

The result of that calculation is added to the x coordination

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

标签: python math cos
2条回答
够拽才男人
2楼-- · 2019-01-12 07:40

Indeed, it is a very low number, awfully close to zero. Here's a great article which can help you understand the common challenges and pitfalls of floats: "What Every Computer Scientist Should Know About Floating-Point Arithmetic"

查看更多
Rolldiameter
3楼-- · 2019-01-12 07:57

You are dealing with rounding errors, which are (mostly) unavoidable when working with floating point math (see the paper already linked by others to understand exactly what's going on).

In many cases you can reduce their impact (by performing the operations in "intelligent" order or reformulating your expressions in a more "floating point-friendly" way), but the simplest thing to do in your situation is to simply the results to e.g. 6 decimal places and be happy with it. Surely you won't need more precision in positioning, and you'll get the results you expect for the "canonical" angles.

查看更多
登录 后发表回答