#!/usr/bin/env python3 """ Beräknar pi med angivet antal decimaler Användning: python3 print_hej.py """ import sys from decimal import Decimal, getcontext def arctan(x, precision): """ Beräknar arctan(1/x) med Taylor-serien arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... """ result = Decimal(0) x = Decimal(x) x_squared = x * x term = Decimal(1) / x sign = 1 for n in range(1000000): divisor = Decimal(2 * n + 1) contrib = term / divisor if sign > 0: result += contrib else: result -= contrib term = term / x_squared sign = -sign # Avbryt om termen är tillräckligt liten if term < Decimal(10) ** (-precision - 10): break return result def calculate_pi(decimals): """ Beräknar pi med Machins formel: pi/4 = 4*arctan(1/5) - arctan(1/239) """ # Sätt precision getcontext().prec = decimals + 20 atan1_5 = arctan(5, decimals) atan1_239 = arctan(239, decimals) # pi = 4 * (4*arctan(1/5) - arctan(1/239)) pi = Decimal(4) * atan1_5 pi = pi - atan1_239 pi = pi * Decimal(4) return pi def main(): # Hämta antal decimaler från argument if len(sys.argv) > 1: try: decimals = int(sys.argv[1]) if decimals < 1: decimals = 100 except ValueError: decimals = 100 else: decimals = 100 # Beräkna pi pi = calculate_pi(decimals) # Skriv ut resultatet med rätt antal decimaler pi_str = str(pi) # Hitta decimalpunkten if '.' in pi_str: int_part, dec_part = pi_str.split('.') # Ta exakt decimals decimaler if len(dec_part) > decimals: dec_part = dec_part[:decimals] else: dec_part = dec_part.ljust(decimals, '0') print(f"{int_part}.{dec_part}") else: print(pi_str) if __name__ == "__main__": main()