Why does tan 45
(0.7853981633974483 in radian) give me 0.9999
? What's wrong with the following code?
System.out.println(Math.tan(Math.toRadians(45.0)) );
I don't think there's any typo in here.
So what's the solution here?
Why does tan 45
(0.7853981633974483 in radian) give me 0.9999
? What's wrong with the following code?
System.out.println(Math.tan(Math.toRadians(45.0)) );
I don't think there's any typo in here.
So what's the solution here?
Floating point calculations will often lead to such inaccuracies. The problem is that numbers cannot be accurately represented within a fixed number of bits.
To give you another example (in decimal), we all agree that
3 * (1/3) = 1
. However, if your calculator only has 4 decimal places,1/3
would be represented as0.3333
. When that's multiplied with3
, you would get0.9999
not1
.As further information, floating points on most systems are usually represented using the IEEE754 standard. You could search for it, or refer the Wikipedia page for more details. IEEE floating point
The closest
double
topi/4
is exactly0x1.921fb54442d18p-1
. The tangent of this double, to more bits than you need, is0x1.fffffffffffff72cece67p-1
. Rounding to the nearestdouble
gives you exactly0x1.fffffffffffffp-1
because0x1.fffffffffffff72cece67p-1
is less than0x1.fffffffffffff8p-1
.Use this
That's probably because
tan(45)
is 1, and the rest is a rounding error. Floating point calculations are highly unlikely to give you accurate results, due to how floating point calculations work.