[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
**Subject**: **Re: Deviation in math functions**
**From**: KHMan <keinhong@...>
**Date**: Fri, 10 Feb 2012 17:12:30 +0800

On 2/10/2012 4:18 PM, roman.maire@besonet.ch wrote:

[snip]
angle = 270
originx = 0
originy = 100
distance = 100
x = (originx + (math.cos(math.rad(angle)) * distance))
y = (originy + (math.sin(math.rad(angle)) * distance))
print("x: ".. x ..", y: ".. y)
Output:
-> x: -1.836970198721e-014, y: 0
I was expecting that x should be 0 too.
am I missing something here?

`It's near the expected error magnitude. A double has about 16
``digits of precision with 53 significand bits. For the calculation
``you used, each of the following are not perfectly precise so error
``accumulates:
`
(1) #define PI (3.14159265358979323846) in lmathlib.c
(2) #define RADIANS_PER_DEGREE (PI/180.0) in lmathlib.c
(3) luaL_checknumber(L, 1)*RADIANS_PER_DEGREE in lmathlib.c
-- for math.rad(angle)
(4) math.sin(...)
(5) math.sin(... * distance)
(6) (originx + ...)

`Each operation adds to the amount of error. So 14-15 digits is
``about right. But it should be enough for almost everyone, after
``all, 1000km to 1mm is only a magnitude of 9. As HyperHacker
``suggests, some Googling and study on the Internet should sort it
``out...
`
--
Cheers,
Kein-Hong Man (esq.)
Kuala Lumpur, Malaysia