Initial commit: Pi calculation benchmark with 34 languages

- Added implementations for: bash, brainfuck, c, cpp, crystal, csharp, d, dart, elixir, erlang, fortran, go, haskell, java, javascript, julia, kotlin, objective-c, scala, typescript, lua, nim, odin, perl, php, python, r, ruby, rust, swift, zig, assembly, vimscript, wolfram
- All implementations use Machin's formula: π/4 = 4*arctan(1/5) - arctan(1/239)
- Build system with ./build.sh, test system with ./test.sh
- Performance testing with ./run_all.sh
- Comprehensive README.md explaining performance differences
- Test framework verifies correctness against known π values
This commit is contained in:
Ein Anderssono
2026-04-23 00:26:18 +02:00
commit 54d2fecee0
182 changed files with 17471 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
#!/bin/bash
# Scala Build Script
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$SCRIPT_DIR"
echo "=== Scala Build ==="
echo ""
# Scala 3 använder scala run för att köra program
# Skapa wrapper script
mkdir -p bin
cat > bin/print_hej << 'EOF'
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$SCRIPT_DIR"
scala run src/print_hej.scala -- "$@"
EOF
chmod +x bin/print_hej
echo "✓ Ingen kompilering behövs för Scala"
echo " Använder scala run"
echo ""
echo "Wrapper script skapad: bin/print_hej"
echo ""
echo "För att köra:"
echo " ./bin/print_hej [decimaler]"
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
# Scala Test Script
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$SCRIPT_DIR"
echo "=== Scala Test ==="
echo ""
# Testa pi-beräkning med olika antal decimaler
for decimals in 1 2 5 10 100; do
result=$(./bin/print_hej $decimals 2>/dev/null)
if [ $? -eq 0 ]; then
echo "$decimals decimaler: $result"
else
echo "$decimals decimaler misslyckades"
fi
done
+27
View File
@@ -0,0 +1,27 @@
{
"name": "scala",
"argv": [
"/opt/homebrew/Cellar/scala-cli/1.13.0/bin/scala-cli",
"--cli-default-scala-version",
"3.8.3",
"--repository",
"file:///opt/homebrew/Cellar/scala/3.8.3/libexec/maven2",
"--prog-name",
"scala",
"--skip-cli-updates",
"bsp",
"--json-options",
"/Users/einand/Code/test/scala/src/.scala-build/ide-options-v2.json",
"--json-launcher-options",
"/Users/einand/Code/test/scala/src/.scala-build/ide-launcher-options.json",
"--envs-file",
"/Users/einand/Code/test/scala/src/.scala-build/ide-envs.json",
"/Users/einand/Code/test/scala/src/print_hej.scala"
],
"version": "1.13.0",
"bspVersion": "2.1.1",
"languages": [
"scala",
"java"
]
}
@@ -0,0 +1 @@
{"version":"1.4.0","project":{"name":"src_fc1c13bc20-63e7ded0de","directory":"/Users/einand/Code/test/scala/src/.scala-build","workspaceDir":"/Users/einand/Code/test/scala/src","sources":["/Users/einand/Code/test/scala/src/print_hej.scala"],"dependencies":[],"classpath":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar"],"out":"/Users/einand/Code/test/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de","classesDir":"/Users/einand/Code/test/scala/src/.scala-build/src_fc1c13bc20-63e7ded0de/classes/main","scala":{"organization":"org.scala-lang","name":"scala-compiler","version":"3.8.3","options":["-sourceroot","/Users/einand/Code/test/scala/src"],"jars":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-compiler_3/3.8.3/scala3-compiler_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-interfaces/3.8.3/scala3-interfaces-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/tasty-core_3/3.8.3/tasty-core_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"],"bridgeJars":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-sbt-bridge/3.8.3/scala3-sbt-bridge-3.8.3.jar"]},"java":{"options":[]},"platform":{"name":"jvm","config":{"home":"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home","options":[]},"mainClass":[]},"resolution":{"modules":[{"organization":"org.scala-lang","name":"scala3-library_3","version":"3.8.3","artifacts":[{"name":"scala3-library_3","path":"/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar"}]},{"organization":"org.scala-lang","name":"scala-library","version":"3.8.3","artifacts":[{"name":"scala-library","path":"/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar"}]}]},"tags":["library"]}}
+1
View File
@@ -0,0 +1 @@
{"JAVA_HOME":"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home","SHELL":"/opt/homebrew/bin/fish","PATH":"/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/debugCommand:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli:/opt/homebrew/opt/openjdk/bin:/Users/einand/.opencode/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Library/Apple/usr/bin:/usr/local/share/dotnet:~/.dotnet/tools:/opt/homebrew/bin:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/debugCommand:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli:/Users/einand/.cargo/bin:/Users/einand/.vscode/extensions/ms-python.debugpy-2025.18.0-darwin-arm64/bundled/scripts/noConfigScripts"}
+1
View File
@@ -0,0 +1 @@
{"args":["/Users/einand/Code/test/scala/src/print_hej.scala"]}
@@ -0,0 +1 @@
{"scalaRunner":{"cliUserScalaVersion":"3.8.3","cliPredefinedRepository":["file:///opt/homebrew/Cellar/scala/3.8.3/libexec/maven2"],"progName":"scala","skipCliUpdates":true}}
@@ -0,0 +1 @@
{}
+90
View File
@@ -0,0 +1,90 @@
// Pi calculation using Machin's formula
// pi/4 = 4*arctan(1/5) - arctan(1/239)
import java.math.BigInteger
import scala.annotation.tailrec
object PiCalculator {
// Calculate arctan(1/x) using Taylor series with arbitrary precision
// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ...
def arctan(x: Int, decimals: Int): BigInteger = {
val scale = BigInteger.TEN.pow(decimals + 10)
val xBig = BigInteger.valueOf(x)
val xSquared = xBig.multiply(xBig)
@tailrec
def compute(term: BigInteger, result: BigInteger, n: Int): BigInteger = {
if (term.equals(BigInteger.ZERO)) {
result
} else {
// Add current term with sign
val newResult = if (n % 2 == 0) result.add(term) else result.subtract(term)
// Next term: term / (x² * (2n+3) / (2n+1))
// Simplified: term * (2n+1) / ((2n+3) * x²)
val numerator = term.multiply(BigInteger.valueOf(2L * n + 1))
val denominator = BigInteger.valueOf(2L * n + 3).multiply(xSquared)
val newTerm = numerator.divide(denominator)
compute(newTerm, newResult, n + 1)
}
}
val initialTerm = scale.divide(xBig)
compute(initialTerm, BigInteger.ZERO, 0)
}
// Calculate pi using Machin's formula
def calculatePi(decimals: Int): String = {
val actualDecimals = if (decimals < 1) 100 else decimals
// Machin's formula: pi/4 = 4*arctan(1/5) - arctan(1/239)
// pi = 16*arctan(1/5) - 4*arctan(1/239)
val arctan5 = arctan(5, actualDecimals)
val arctan239 = arctan(239, actualDecimals)
// pi = 16*arctan(1/5) - 4*arctan(1/239)
val pi = arctan5.multiply(BigInteger.valueOf(16)).subtract(arctan239.multiply(BigInteger.valueOf(4)))
// Format output
val piStr = pi.toString()
if (actualDecimals == 0) {
"3"
} else {
// Pad with zeros if needed
val padded = if (piStr.length < actualDecimals + 1) {
val zerosNeeded = actualDecimals + 1 - piStr.length
"0" * zerosNeeded + piStr
} else {
piStr
}
// Insert decimal point
val beforeDecimal = padded.substring(0, 1)
val afterDecimal = padded.substring(1)
// Pad or truncate to desired length
val finalAfterDecimal = if (afterDecimal.length < actualDecimals) {
afterDecimal + "0" * (actualDecimals - afterDecimal.length)
} else {
afterDecimal.substring(0, actualDecimals)
}
s"$beforeDecimal.$finalAfterDecimal"
}
}
def main(args: Array[String]): Unit = {
val decimals = if (args.length > 0) {
try {
val d = args(0).toInt
if (d < 1) 100 else d
} catch {
case _: NumberFormatException => 100
}
} else {
100
}
println(calculatePi(decimals))
}
}