Opa_omroep-automatiseren/venv/lib/python3.8/site-packages/pymeeus/base.py
Eljakim Herrewijnen f26bbbf103 initial
2020-12-27 21:00:11 +01:00

147 lines
3.9 KiB
Python

# -*- 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"""
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))
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))
unit = ordinal % 10
if unit == 1 and ordinal != 11:
return "st"
elif unit == 2 and ordinal != 12:
return "nd"
elif unit == 3 and ordinal != 13:
return "rd"
else:
return "th"
def iint(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.
>>> iint(19)
19
>>> iint(19.95)
19
>>> iint(-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 11 is", get_ordinal_suffix(11))
print_me("The suffix for ordinal 12 is", get_ordinal_suffix(12))
print_me("The suffix for ordinal 13 is", get_ordinal_suffix(13))
print_me("The suffix for ordinal 14 is", get_ordinal_suffix(14))
print_me("The suffix for ordinal 16 is", get_ordinal_suffix(16))
print_me("The suffix for ordinal 23 is", get_ordinal_suffix(23))
if __name__ == "__main__":
main()