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
+30
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Dart Build Script
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
echo "=== Dart Build ==="
|
||||
echo ""
|
||||
|
||||
# Check for dart
|
||||
if ! command -v dart &> /dev/null; then
|
||||
echo "✗ Dart-kompilator hittades inte!"
|
||||
echo " Installera Dart: brew install dart"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Använder: dart"
|
||||
|
||||
# Compile to native executable
|
||||
if dart compile exe src/print_hej.dart -o bin/print_hej 2>&1; then
|
||||
echo "✓ Kompilering lyckades!"
|
||||
echo " Executable: bin/print_hej"
|
||||
echo ""
|
||||
echo "För att köra:"
|
||||
echo " ./bin/print_hej <decimaler>"
|
||||
else
|
||||
echo "✗ Kompilering misslyckades!"
|
||||
exit 1
|
||||
fi
|
||||
@@ -0,0 +1,71 @@
|
||||
import 'dart:io';
|
||||
|
||||
// Calculate arctan(1/x) using Taylor series
|
||||
// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ...
|
||||
BigInt arctan(int x, int decimals) {
|
||||
BigInt scale = BigInt.from(10).pow(decimals + 10);
|
||||
BigInt xBig = BigInt.from(x);
|
||||
BigInt xSquared = xBig * xBig;
|
||||
|
||||
BigInt term = scale ~/ xBig;
|
||||
BigInt result = BigInt.zero;
|
||||
int n = 0;
|
||||
|
||||
while (term != BigInt.zero && n < decimals * 3) {
|
||||
BigInt divisor = BigInt.from(2 * n + 1);
|
||||
BigInt contrib = term ~/ divisor;
|
||||
|
||||
if (n % 2 == 0) {
|
||||
result += contrib;
|
||||
} else {
|
||||
result -= contrib;
|
||||
}
|
||||
|
||||
term = term ~/ xSquared;
|
||||
n++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
BigInt calculatePi(int decimals) {
|
||||
BigInt atan1_5 = arctan(5, decimals);
|
||||
BigInt atan1_239 = arctan(239, decimals);
|
||||
|
||||
// pi = 16*arctan(1/5) - 4*arctan(1/239)
|
||||
return atan1_5 * BigInt.from(16) - atan1_239 * BigInt.from(4);
|
||||
}
|
||||
|
||||
void main(List<String> args) {
|
||||
int decimals = 100;
|
||||
|
||||
if (args.isNotEmpty) {
|
||||
try {
|
||||
decimals = int.parse(args[0]);
|
||||
if (decimals < 1) decimals = 100;
|
||||
} catch (e) {
|
||||
decimals = 100;
|
||||
}
|
||||
}
|
||||
|
||||
BigInt pi = calculatePi(decimals);
|
||||
String piStr = pi.toString();
|
||||
|
||||
// Print with decimal point
|
||||
stdout.write('3.');
|
||||
|
||||
int startIndex = 1;
|
||||
int endIndex = startIndex + decimals;
|
||||
if (endIndex > piStr.length) {
|
||||
endIndex = piStr.length;
|
||||
}
|
||||
|
||||
stdout.write(piStr.substring(startIndex, endIndex));
|
||||
|
||||
// Pad with zeros if needed
|
||||
for (int i = 0; i < decimals - (endIndex - startIndex); i++) {
|
||||
stdout.write('0');
|
||||
}
|
||||
|
||||
print('');
|
||||
}
|
||||
Reference in New Issue
Block a user