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