# -*- coding: utf-8 -*-
# PyMeeus: Python module implementing astronomical algorithms.
# Copyright (C) 2018 Dagoberto Salazar
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from math import floor
"""
.. module:: base
:synopsis: Basic routines and constants used by the pymeeus module
:license: GNU Lesser General Public License v3 (LGPLv3)
.. moduleauthor:: Dagoberto Salazar
"""
TOL = 1E-10
"""Internal tolerance being used by default"""
[docs]def machine_accuracy():
"""This function computes the accuracy of the computer being used.
This function returns a tuple containing the number of significant bits in
the mantissa of a floating number, and the number of significant digits in
a decimal number.
:returns: Number of significant bits, and of significant digits
:rtype: tuple
"""
j = 0.0
x = 2.0
while x + 1.0 != x:
j += 1.0
x *= 2.0
return (j, int(j*0.30103))
[docs]def get_ordinal_suffix(ordinal):
"""Method to get the suffix of a given ordinal number, like 1'st',
2'nd', 15'th', etc.
:param ordinal: Ordinal number
:type ordinal: int
:returns: Suffix corresponding to input ordinal number
:rtype: str
:raises: TypeError if input type is invalid.
>>> get_ordinal_suffix(40)
'th'
>>> get_ordinal_suffix(101)
'st'
>>> get_ordinal_suffix(2)
'nd'
>>> get_ordinal_suffix(19)
'th'
>>> get_ordinal_suffix(23)
'rd'
"""
if not isinstance(ordinal, (int, float)):
raise TypeError("Invalid input type")
else:
ordinal = int(floor(ordinal))
ordinal = ordinal % 10
if ordinal == 1:
return 'st'
elif ordinal == 2:
return 'nd'
elif ordinal == 3:
return 'rd'
else:
return 'th'
[docs]def INT(number):
"""This method behaves in the same way as the **INT()** function described
by Meeus in his book: Greatest integer which is not greater than number.
:param number: Number or expresion
:type number: int, float
:returns: Greatest integer which is not greater than number
:rtype: int
:raises: TypeError if input type is invalid.
>>> INT(19)
19
>>> INT(19.95)
19
>>> INT(-2.4)
-3
"""
if not isinstance(number, (int, float)):
raise TypeError("Invalid input type")
else:
return int(floor(number))
def main():
# Let's define a small helper function
def print_me(msg, val):
print("{}: {}".format(msg, val))
# Let's print the tolerance
print_me("The default value for the tolerance is", TOL)
# Find the accuracy of this computer
j, d = machine_accuracy()
print_me("Number of significant BITS in the mantissa\t", j)
print_me("Number of significant DIGITS in a decimal number", d)
print("")
print_me("The suffix for ordinal 2 is", get_ordinal_suffix(2))
print_me("The suffix for ordinal 16 is", get_ordinal_suffix(16))
if __name__ == '__main__':
main()