Antwort des Community-Wikis :
Sie sind möglicherweise enttäuscht von den Ergebnissen in SQL Server im Vergleich zu PostgreSQL (das sehr große Zahlen wie 30000! Ohne Genauigkeitsverlust verarbeiten kann).
In SQL Server 33!
ist so hoch wie Sie mit einer exakten Genauigkeit gehen können , während 170!
so hoch ist , wie Sie überhaupt gehen kann ( 171!
ist1.24E309
das die Grenzen überschreitet float
).
Sie können sie also einfach vorberechnen und in einer Tabelle mit Werten speichern 0 ... 170
. Dies passt auf eine einzelne Datenseite, wenn die Komprimierung verwendet wird.
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);
Alternativ wird die folgende genaue Ergebnisse für @N bis zu 10 geben - und die ungefähre für 11+ (es wäre genauer , wenn die verschiedenen Funktionen / Konstanten ( PI()
, EXP()
, POWER()
mit gearbeitet) DECIMAL
Typen , aber sie arbeiten mit FLOAT
nur):
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))
);