I am currently working on a Physics Engine in C++. The Physics Engine is for a sandbox video game. I want to build a powerful physics engine, so therefore, it needs to be very precise.

I have written the following function:

Vector3D* rotationX(double theta);

This function will rotate a vector around the x-axis at theta degrees. My test attempts to rotate the vector <0,1,0> about the x-axis, which should be the vector <0,0,1>. The output is the following vector, which is very close to what it should be: <0,0.000796327,1>.

I am aware of the floor function, but I think this isn't precise enough since my 3-d vector class should be able to handle real numbers; that is, not just integers.

  • You are not handling real numbers. You are not even handling rational numbers. You are handling floating point numbers. If you need to handle rational numbers, you'll need a library for handling arbitrary precision "decimal" numbers. – 94239 Aug 24 '19 at 21:40
  • 7
    The result you have is not very close at all. That's not due to rounding error, there is some serious bug in your code. – gnasher729 Aug 24 '19 at 22:01
  • Its best to publish the code. – NoChance Aug 25 '19 at 0:39
  • 1
    Have you quantified how precise it needs to be? – StackOverthrow Aug 26 '19 at 16:50
  • @TKK problems fixed. – Gary Drocella Aug 26 '19 at 16:54

You have basically the following options:

1.) Do nothing. Maybe the result is precise enough for your use case. Note when using floating point operations, it is quite normal you have to deal with some rounding errors. I would recommend to have a look at What Every Computer Scientist Should Know About Floating-Point Arithmetic.

2.) If your use case involves comparing two vectors for equality, make sure you compare against some "epsilon", where epsilon is about 10^(-3).

3.) Find out why the result is that much imprecise. A rotation involving standard trigonometric functions which uses 64 bit double precision should usually bring results up to a preciseness better than 10^(-10) to my experience.

In between, it became clear (see comments) that in this case the root cause was using 3.14 as an approximation for Pi. It is usually a good idea to use predefined constants for such standard values whenever they are available in the used environment. In C++, for example, one can use the constant M_PI from <math.h> (see this SO post).

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.