package main import ( "fmt" "math/big" "net/http" "strconv" "time" ) func calculatePi(n int) *big.Float { precision := uint(n * 14) pi := new(big.Float).SetPrec(precision) pi.SetInt64(0) one := new(big.Float).SetInt64(1) two := new(big.Float).SetInt64(2) four := new(big.Float).SetInt64(4) five := new(big.Float).SetInt64(5) six := new(big.Float).SetInt64(6) eight := new(big.Float).SetInt64(8) sixteen := new(big.Float).SetInt64(16) for i := 0; i < n; i++ { k := new(big.Float).SetInt64(int64(i)) // Obliczanie 16^i powSixteen := new(big.Float).SetInt64(1) for j := 0; j < i; j++ { powSixteen.Mul(powSixteen, sixteen) } // Obliczanie 1/16^i denominator := new(big.Float).SetPrec(precision) if powSixteen.Sign() != 0 { denominator.Quo(one, powSixteen) } else { continue } // Obliczanie poszczególnych składników term1 := new(big.Float).SetPrec(precision) term1.Mul(eight, k) term1.Add(term1, one) term1.Quo(four, term1) term2 := new(big.Float).SetPrec(precision) term2.Mul(eight, k) term2.Add(term2, four) term2.Quo(two, term2) term3 := new(big.Float).SetPrec(precision) term3.Mul(eight, k) term3.Add(term3, five) term3.Quo(one, term3) term4 := new(big.Float).SetPrec(precision) term4.Mul(eight, k) term4.Add(term4, six) term4.Quo(one, term4) // Łączenie składników sum := new(big.Float).SetPrec(precision) sum.Sub(term1, term2) sum.Sub(sum, term3) sum.Sub(sum, term4) // Mnożenie przez 1/16^i i dodawanie do wyniku sum.Mul(sum, denominator) pi.Add(pi, sum) } return pi } func main() { http.HandleFunc("/pi", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") precisionStr := r.URL.Query().Get("precision") precision, err := strconv.Atoi(precisionStr) if err != nil { http.Error(w, "Invalid precision parameter", http.StatusBadRequest) return } start := time.Now() pi := calculatePi(precision) duration := time.Since(start) // Format PI to specified precision piFormatted := fmt.Sprintf("%.*f", precision, pi) response := fmt.Sprintf(`{"pi": "%s", "time": "%v", "language": "Go"}`, piFormatted, duration) w.Header().Set("Content-Type", "application/json") fmt.Fprint(w, response) }) fmt.Println("Go server starting on port 8081...") http.ListenAndServe(":8081", nil) }