Calculate using C# System.Math class [C++ <cmath> header] √2, 21/5, eπ, πe.
Something like
double sqrt2=System.Math.Sqrt(2.0); System.Console.WriteLine($"Sqrt(2) = {sqrt2}");
double sqrt2=std::sqrt(2.0); std::cout << "sqrt(2) = " << sqrt2 << std::endl;
Using the following Stirling approximation for the gamma-function Γ(x),
using static System.Math; public static class sfuns{ public static double fgamma(double x){ ///single precision gamma function if(x<0)return PI/Sin(PI*x)/fgamma(1-x); // Euler's reflection formula if(x<9)return fgamma(x+1)/x; // Recurrence relation double lnfgamma=x*Log(x+1/(12*x-1/x/10))-x+Log(2*PI/x)/2; return Exp(lnfgamma); } }
#include<cmath> #include"sfuns.h" namespace sfuns{ double fgamma(double x){ if(x<0)return M_PI/std::sin(M_PI*x)/fgamma(1-x); if(x<9)return fgamma(x+1)/x; double lnfgamma=x*std::log(x+1/(12*x-1/x/10))-x+std::log(2*PI/x)/2; return std::exp(lnfgamma); } }
// "sfuns.h" header file #ifndef HAVE_SFUNS_H #define HAVE_SFUNS_H namespace sfuns{ double fgamma(double x); } #endifcalculate Γ(1), Γ(2), Γ(3), …, Γ(10). Check that the results are correct (within single precision: about 6 decimal digits).
You should put your gamma function in a static class "sfuns" [namespace "sfuns"] in a file "sfuns.cs" ["sfuns.cc"], compile it separately into a library "sfuns.dll" [object code "sfuns.o"], and then link to your Main [main] function.
The gamma-function overflows very easily, so the logarithm
of the gamma function, lngamma
, is often a more useful
function. Figure out how to modify the above formula to calculate
lngamma
. For simplicity you should only allow positive
arguments for your lngamma
:
if(x <= 0) return double.NaN; if(x < 9) return lngamma(x+1) - Log(x);
if(x <= 0) return NAN; if(x < 9) return lngamma(x+1) - std::log(x);
Out.txt: main.exe mono main.exe > Out.txt
Out.txt: main ./main > Out.txt
sfuns.dll : sfuns.cs mcs -target:library -out:sfuns.dll sfuns.cs
sfuns.o : sfuns.cc sfuns.h $(CXX) $(CXXFLAGS) -c -o sfuns.o sfuns.cc # -c stands for compile only
main.exe : main.cs sfuns.dll mcs -target:exe -out:main.exe -reference:sfuns.dll main.cs
CXXFLAGS += -Wall -std=c++23 -O2 LDLIBS += -lstdc++ -lm main : main.o sfuns.o $(CXX) $(LDLIBS) -o main main.o sfuns.o main.o : main.cc sfuns.h $(CXX) $(CXXFLAGS) -c -o main.o main.cc