# -*- 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 . 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()