Monday, 15 August 2011

objective c - CGAffineTransformMakeRotation on CGPoint unexpected values -



objective c - CGAffineTransformMakeRotation on CGPoint unexpected values -

i rotating cgpoints using cgaffinetransformrotation

executing code:

double degtorad(double degrees) { homecoming ((degrees) * (m_pi / 180.0)); } cgaffinetransform rotate = cgaffinetransformmakerotation(degtorad(-90.0)); nslog(@"before n.np %@",nsstringfromcgpoint(node.nodepoint)); node.nodepoint = cgpointapplyaffinetransform(node.nodepoint, rotate); nslog(@"after n.np %@",nsstringfromcgpoint(node.nodepoint));

gives these results:

before n.np {96, 196} after n.np {196, -95.999999999999986}

this understandable; -95.999... opposed -96 due internal rounding/the limit on grade of look of m_pi. grade of difference in instance negligible.

but these results:

before n.np {0, 768} after n.np {768, 4.702643708725836e-14}

...are puzzle me. expect {768, 0} or pretty dang close homecoming value. why grade of difference in case large?

so difference isn't large. in fact, it's tiny! before jump why there difference, let's explain difference means:

after n.np {768, 4.702643708725836e-14}

notice e-14 @ end. means 4.702643708725836 x 10^-14, or .00000000000004702643708725836, close 0. larn more e notation, read this!

now, why happens both inaccuracy of m_pi , floating point representation. floating point numbers (floats) how c language (and many others) represent non-integral (int) numbers. uses approximation-based method it's impossible represent numbers in realistic number of bits. doubles floats, utilize 2 times many bits (hence double) represent real numbers, , have more accuracy. still approximations, , have little artifacts of inaccuracy, , you shouldn't straight compare floats typically.

objective-c ios7 cgaffinetransform cgpoint

No comments:

Post a Comment