numpy.sin(pi) returns negative value

2019-01-26 19:55发布

问题:

The following code:

a = numpy.sin(2. * numpy.pi)
print(a < 0)

return "True". But in reality a = 0. How could I fix that? In addition, I have a matrix with a lot of value like "a" and I want to make sure that my matrix contains non-negative value.

回答1:

This because of floating point arithmetic, and accuracy reasons. The result is the best approximation of sin one can get to be representable as a floating point number. Usually you solve near-zero problems like this:

a = numpy.sin(2. * numpy.pi)
print(abs(a) < 1e-10)

You may also want to read this.



回答2:

In reality a <> 0 because in reality numpy.pi is not Pi (what is Pi in reality anyway?) - it is just its approximation and numpy.sin is not sine - it is its approximation as well. So you have to take some error into account, for example

print( -0.0000001 < a < 0.0000001 )

or use some other tricks (representing Pi differently - not as a float number ).



回答3:

>>> import numpy
>>> a = numpy.sin(2. * numpy.pi)
>>> numpy.allclose(a, 0)
True
>>> numpy.clip(numpy.array([-0.1, 1.0, 2.0]), 0, np.inf)
array([ 0.,  1.,  2.])


回答4:

When I calculate

numpy.sin(2 * numpy.pi)

I get

-2.4492935982947064e-16 # i.e. -0.0000000000000002

This is a classic floating point accuracy error. You are better taking a tolerance approach to testing the value:

if abs(a) < 0.0001: