Jawaban wiki komunitas :
Anda mungkin kecewa dengan hasil dalam SQL Server dibandingkan dengan PostgreSQL (yang mampu menangani angka yang sangat besar seperti 30000! Tanpa kehilangan presisi).
Dalam SQL Server 33!
adalah setinggi yang Anda bisa pergi dengan presisi yang tepat sementara 170!
setinggi Anda bisa pergi sama sekali ( 171!
adalah1.24E309
yang melebihi batas-batas float
).
Jadi Anda bisa menghitung ulang dan menyimpannya dalam tabel dengan nilai 0 ... 170
. Ini cocok pada halaman data tunggal jika kompresi digunakan.
CREATE TABLE dbo.Factorials
(
N TINYINT PRIMARY KEY WITH (DATA_COMPRESSION = ROW),
FactorialExact NUMERIC(38, 0) NULL,
FactorialApprox FLOAT NOT NULL
);
WITH R(N, FactorialExact, FactorialApprox)
AS (SELECT 0,
CAST(1 AS NUMERIC(38, 0)),
1E0
UNION ALL
SELECT R.N + 1,
CASE WHEN R.N < 33 THEN ( R.N + 1 ) * R.FactorialExact END,
CASE WHEN R.N < 170 THEN ( R.N + 1 ) * R.FactorialApprox END
FROM R
WHERE R.N < 170)
INSERT INTO dbo.Factorials
(N,
FactorialExact,
FactorialApprox)
SELECT N,
FactorialExact,
FactorialApprox
FROM R
OPTION (MAXRECURSION 170);
Atau, berikut ini akan memberikan hasil yang akurat untuk @N hingga 10 - dan perkiraan untuk 11 + (akan lebih akurat jika berbagai fungsi / konstanta ( PI()
, EXP()
, POWER()
) bekerja sama dengan DECIMAL
jenis tetapi mereka bekerja dengan FLOAT
hanya):
DECLARE @N integer = 10;
SELECT
CONVERT
(
DECIMAL(38,0),
SQRT(2 * PI() * @N) *
POWER(@N/EXP(1), @N) *
EXP(1.0/12.0/@N + 1.0/360.0/POWER(@N, 3))
);