picomath

Pascal

log_factorial.pas

unit log_factorial;

interface

uses math;

function log_factorial(n: integer): float;

implementation

function log_factorial(n: integer): float;

const
    lf: array [0..254] of float = (
        0.000000000000000,
        0.000000000000000,
        0.693147180559945,
        1.791759469228055,
        3.178053830347946,
        4.787491742782046,
        6.579251212010101,
        8.525161361065415,
        10.604602902745251,
        12.801827480081469,
        15.104412573075516,
        17.502307845873887,
        19.987214495661885,
        22.552163853123421,
        25.191221182738683,
        27.899271383840894,
        30.671860106080675,
        33.505073450136891,
        36.395445208033053,
        39.339884187199495,
        42.335616460753485,
        45.380138898476908,
        48.471181351835227,
        51.606675567764377,
        54.784729398112319,
        58.003605222980518,
        61.261701761002001,
        64.557538627006323,
        67.889743137181526,
        71.257038967168000,
        74.658236348830158,
        78.092223553315307,
        81.557959456115029,
        85.054467017581516,
        88.580827542197682,
        92.136175603687079,
        95.719694542143202,
        99.330612454787428,
        102.968198614513810,
        106.631760260643450,
        110.320639714757390,
        114.034211781461690,
        117.771881399745060,
        121.533081515438640,
        125.317271149356880,
        129.123933639127240,
        132.952575035616290,
        136.802722637326350,
        140.673923648234250,
        144.565743946344900,
        148.477766951773020,
        152.409592584497350,
        156.360836303078800,
        160.331128216630930,
        164.320112263195170,
        168.327445448427650,
        172.352797139162820,
        176.395848406997370,
        180.456291417543780,
        184.533828861449510,
        188.628173423671600,
        192.739047287844900,
        196.866181672889980,
        201.009316399281570,
        205.168199482641200,
        209.342586752536820,
        213.532241494563270,
        217.736934113954250,
        221.956441819130360,
        226.190548323727570,
        230.439043565776930,
        234.701723442818260,
        238.978389561834350,
        243.268849002982730,
        247.572914096186910,
        251.890402209723190,
        256.221135550009480,
        260.564940971863220,
        264.921649798552780,
        269.291097651019810,
        273.673124285693690,
        278.067573440366120,
        282.474292687630400,
        286.893133295426990,
        291.323950094270290,
        295.766601350760600,
        300.220948647014100,
        304.686856765668720,
        309.164193580146900,
        313.652829949878990,
        318.152639620209300,
        322.663499126726210,
        327.185287703775200,
        331.717887196928470,
        336.261181979198450,
        340.815058870798960,
        345.379407062266860,
        349.954118040770250,
        354.539085519440790,
        359.134205369575340,
        363.739375555563470,
        368.354496072404690,
        372.979468885689020,
        377.614197873918670,
        382.258588773060010,
        386.912549123217560,
        391.575988217329610,
        396.248817051791490,
        400.930948278915760,
        405.622296161144900,
        410.322776526937280,
        415.032306728249580,
        419.750805599544780,
        424.478193418257090,
        429.214391866651570,
        433.959323995014870,
        438.712914186121170,
        443.475088120918940,
        448.245772745384610,
        453.024896238496130,
        457.812387981278110,
        462.608178526874890,
        467.412199571608080,
        472.224383926980520,
        477.044665492585580,
        481.872979229887900,
        486.709261136839360,
        491.553448223298010,
        496.405478487217580,
        501.265290891579240,
        506.132825342034830,
        511.008022665236070,
        515.890824587822520,
        520.781173716044240,
        525.679013515995050,
        530.584288294433580,
        535.496943180169520,
        540.416924105997740,
        545.344177791154950,
        550.278651724285620,
        555.220294146894960,
        560.169054037273100,
        565.124881094874350,
        570.087725725134190,
        575.057539024710200,
        580.034272767130800,
        585.017879388839220,
        590.008311975617860,
        595.005524249382010,
        600.009470555327430,
        605.020105849423770,
        610.037385686238740,
        615.061266207084940,
        620.091704128477430,
        625.128656730891070,
        630.172081847810200,
        635.221937855059760,
        640.278183660408100,
        645.340778693435030,
        650.409682895655240,
        655.484856710889060,
        660.566261075873510,
        665.653857411105950,
        670.747607611912710,
        675.847474039736880,
        680.953419513637530,
        686.065407301994010,
        691.183401114410800,
        696.307365093814040,
        701.437263808737160,
        706.573062245787470,
        711.714725802289990,
        716.862220279103440,
        722.015511873601330,
        727.174567172815840,
        732.339353146739310,
        737.509837141777440,
        742.685986874351220,
        747.867770424643370,
        753.055156230484160,
        758.248113081374300,
        763.446610112640200,
        768.650616799717000,
        773.860102952558460,
        779.075038710167410,
        784.295394535245690,
        789.521141208958970,
        794.752249825813460,
        799.988691788643450,
        805.230438803703120,
        810.477462875863580,
        815.729736303910160,
        820.987231675937890,
        826.249921864842800,
        831.517780023906310,
        836.790779582469900,
        842.068894241700490,
        847.352097970438420,
        852.640365001133090,
        857.933669825857460,
        863.231987192405430,
        868.535292100464630,
        873.843559797865740,
        879.156765776907600,
        884.474885770751830,
        889.797895749890240,
        895.125771918679900,
        900.458490711945270,
        905.796028791646340,
        911.138363043611210,
        916.485470574328820,
        921.837328707804890,
        927.193914982476710,
        932.555207148186240,
        937.921183163208070,
        943.291821191335660,
        948.667099599019820,
        954.046996952560450,
        959.431492015349480,
        964.820563745165940,
        970.214191291518320,
        975.612353993036210,
        981.015031374908400,
        986.422203146368590,
        991.833849198223450,
        997.249949600427840,
        1002.670484599700300,
        1008.095434617181700,
        1013.524780246136200,
        1018.958502249690200,
        1024.396581558613400,
        1029.838999269135500,
        1035.285736640801600,
        1040.736775094367400,
        1046.192096209724900,
        1051.651681723869200,
        1057.115513528895000,
        1062.583573670030100,
        1068.055844343701400,
        1073.532307895632800,
        1079.012946818975000,
        1084.497743752465600,
        1089.986681478622400,
        1095.479742921962700,
        1100.976911147256000,
        1106.478169357800900,
        1111.983500893733000,
        1117.492889230361000,
        1123.006317976526100,
        1128.523770872990800,
        1134.045231790853000,
        1139.570684729984800,
        1145.100113817496100,
        1150.633503306223700,
        1156.170837573242400
    );

var x: float;

begin
    Assert(n >= 0);
    if n > 254 then begin
        x := n + 1;
        log_factorial := (x - 0.5)*ln(x) - x + 0.5*ln(2*pi) + 1.0/(12.0*x);
    end else
        log_factorial := lf[n];
end;

end.