# Why is my target above/below the horizon at the rise/set time?¶

Rise/set/meridian transit calculations in `astroplan`

are designed to be fast
while achieving a precision comparable to what can be predicted given the
affects of the changing atmosphere. As a result, there may be some
counter-intuitive behavior in `astroplan`

methods like
`astroplan.Observer.target_rise_time`

, `astroplan.Observer.target_set_time`

and
`astroplan.Observer.target_meridian_transit_time`

, that can lead to small
changes in the numerical values of these computed timed (of order seconds).

For example, to calculate the rise time of Sirius, you might write:

```
from astroplan import Observer, FixedTarget
from astropy.time import Time
# Set up observer, target, and time
keck = Observer.at_site("Keck")
sirius = FixedTarget.from_name("Sirius")
time = Time('2010-05-11 06:00:00')
# Find rise time of Sirius at Keck nearest to `time`
rise_time = keck.target_rise_time(time, sirius)
```

You might expect the altitude of Sirius to be zero degrees at `rise_time`

,
i.e. Sirius will be on the horizon, but this is not the case:

```
>>> altitude_at_rise = keck.altaz(rise_time, sirius).alt
>>> print(altitude_at_rise.to('arcsec'))
2.70185arcsec
```

The altitude that you compute on your machine may be different from the number
above by a small amount – for a detailed explanation on where the difference
arises from, see *What are the IERS tables and how do I update them?*. The rise and set time methods use the following
approximation:

- A time series of altitudes for the target is computed at times near
`time`

- The two times when the target is nearest to the horizon are identified, and a linear interpolation is done between those times to find the horizon-crossing

This method has a precision of a few arcseconds, so your targets may be slightly above or below the horizon at their rise or set times.