dodanie obliczania liczb pi
This commit is contained in:
0
obliczanie_pi/golang/.gitignore
vendored
Normal file
0
obliczanie_pi/golang/.gitignore
vendored
Normal file
3
obliczanie_pi/golang/go.mod
Normal file
3
obliczanie_pi/golang/go.mod
Normal file
@@ -0,0 +1,3 @@
|
||||
module mkedziora/obliczaniepi
|
||||
|
||||
go 1.23.2
|
||||
101
obliczanie_pi/golang/main.go
Normal file
101
obliczanie_pi/golang/main.go
Normal file
@@ -0,0 +1,101 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user