picomath

Scheme

log-factorial.scm

(define (log-factorial n)
    (if (< n 0)
        (error "Invalid input"))
    (if (> n 254)
        (let ((x (+ n 1))
              (pi (* 4 (atan 1))))
            (+ (* (- x 0.5) (log x)) (- x) (* 0.5 (log (* 2 pi))) (/ 1.0 (* 12.0 x))))
        (let ((lf #(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)))
            (vector-ref lf n))))