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:
Executable
+29
@@ -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]"
|
||||
Executable
+19
@@ -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
|
||||
@@ -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"]}}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -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"}
|
||||
@@ -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 @@
|
||||
{}
|
||||
Binary file not shown.
@@ -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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user