From 8b9a5912f6691b04d703998786f4dd6c6f684596 Mon Sep 17 00:00:00 2001 From: Regis Portalez Date: Fri, 14 Dec 2018 10:46:58 +0100 Subject: [PATCH] inline _factorialCache to a static readonly field Assembly size should not be an issue in this code. Should be a bit faster, since _factorialCache should now stay in the data segment (cached) instead of global memory values are store as hexadecimal constants, to save all bits, so new version returns the exact same values as before --- src/Numerics/SpecialFunctions/Factorial.cs | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/Numerics/SpecialFunctions/Factorial.cs b/src/Numerics/SpecialFunctions/Factorial.cs index f45ad69a..1abc0143 100644 --- a/src/Numerics/SpecialFunctions/Factorial.cs +++ b/src/Numerics/SpecialFunctions/Factorial.cs @@ -38,25 +38,10 @@ namespace MathNet.Numerics public partial class SpecialFunctions { const int FactorialMaxArgument = 170; - static double[] _factorialCache; - - /// - /// Initializes static members of the SpecialFunctions class. - /// - static SpecialFunctions() + static readonly double[] _factorialCache = { - InitializeFactorial(); - } - - static void InitializeFactorial() - { - _factorialCache = new double[FactorialMaxArgument + 1]; - _factorialCache[0] = 1.0; - for (int i = 1; i < _factorialCache.Length; i++) - { - _factorialCache[i] = _factorialCache[i - 1]*i; - } - } + 0x3FF0000000000000, 0x3FF0000000000000, 0x4000000000000000, 0x4018000000000000, 0x4038000000000000, 0x405E000000000000, 0x4086800000000000, 0x40B3B00000000000, 0x40E3B00000000000, 0x4116260000000000, 0x414BAF8000000000, 0x418308A800000000, 0x41BC8CFC00000000, 0x41F7328CC0000000, 0x42344C3B28000000, 0x4273077775800000, 0x42B3077775800000, 0x42F437EEECD80000, 0x4336BEECCA730000, 0x437B02B930689000, 0x43C0E1B3BE415A00, 0x4406283BE9B5C620, 0x444E77526159F06C, 0x4495E5C335F8A4CE, 0x44E06C52687A7B9A, 0x4529A940C33F6121, 0x4574D9849EA37EEB, 0x45C19787E5D9F316, 0x460EC92DD23D6966, 0x465BE6518687A784, 0x46AA27EC6E1F2D0C, 0x46F956AD0AAE33A4, 0x474956AD0AAE33A4, 0x479A21627303A541, 0x47EBC3789A33DF95, 0x483E5DCBE8A8BC8B, 0x489114C2B2DEEA0E, 0x48E3C0011ED1BEA0, 0x493774015499125E, 0x498C95619F1A8E63, 0x49E1DD5D037098FE, 0x4A36E39F2C684405, 0x4A8E0AC0EA48D947, 0x4AE42F399D68F1FC, 0x4B3BC0EF38704CBA, 0x4B9383A833AEF5F3, 0x4BEC0D41CA4B818D, 0x4C4499BC508F7324, 0x4C9EE69A78D72CB6, 0x4CF7A88E4484BE3B, 0x4D527BAF2587B49E, 0x4DAD751F23D047DC, 0x4E07EF294D193A63, 0x4E63D20E33D8E45A, 0x4EC0B93BFBBF00AC, 0x4F1CBE5F18B04928, 0x4F792693359A4003, 0x4FD6665B1BBD6103, 0x50344CC291239FEB, 0x5092B6C35DCCD76D, 0x50F18B5727F009F6, 0x5150B8CF1210C97E, 0x51B0330899804332, 0x520FE478EE34844A, 0x526FE478EE34844A, 0x52D0320568F6AB2E, 0x5330B395943E6087, 0x53917C0097314D0D, 0x53F293C0A0A461DE, 0x5454074BAD313983, 0x54B5E7FAC56DD6E7, 0x55184D5A3305DA68, 0x557B5705796695B5, 0x55DF2F423E7902C2, 0x564207524C1DF598, 0x56A5209471331BCE, 0x570916B0466CB105, 0x576E2F4C14BAC4FA, 0x57D264D25CA1D008, 0x5836B473AA57BCCA, 0x589C619094EDABFC, 0x5901F5BD7E3E66D5, 0x596702DAC9BFF3C1, 0x59CDD7B3BDA4F01E, 0x5A33958DF4743D94, 0x5A9A02A088AA61C9, 0x5B0179C3DBD279B3, 0x5B67C1863ED21D6F, 0x5BD0550C4B30743C, 0x5C36B645188F61A3, 0x5C9FF0512A89A14D, 0x5D06B4D9B43DD8AD, 0x5D7051FC798C73BC, 0x5DD7B722E0A0182D, 0x5E416A7D9CF591C1, 0x5EA9DA1274FC845A, 0x5F13638DD7BD6344, 0x5F7D62E2FAFB0A73, 0x5FE67FB5C8283400, 0x605166C698CF1838, 0x60BB30964EC395D8, 0x612574569A26543C, 0x619118B502D68B20, 0x61FB83C3509147E8, 0x62665B0EB1760A6C, 0x62D256B20D92D48D, 0x633E5F96E67B300A, 0x63A963E824AAFA28, 0x64156C4BDEF04312, 0x64823E389BD8991D, 0x64EF5AF14BDC472A, 0x655B30DD3FC905B6, 0x65C7CAC197CFE4FF, 0x663500FEE8058829, 0x66A2B4E306A4ED45, 0x6710CE83F7F82D2C, 0x677E764F3171D1E0, 0x67EBD824633209D7, 0x6859AB418B722112, 0x68C7DD36EFA41ABF, 0x69365F6380A9D913, 0x69A5262C0FA08F34, 0x6A142861FEE5087E, 0x6A835ECE2AF01629, 0x6AF2C3D7B9989578, 0x6B625340AB3F01F7, 0x6BD209F3A89205EF, 0x6C41E5DFC140E1E3, 0x6CB1E5DFC140E1E3, 0x6D2209AB80C363A7, 0x6D9251D22EC67136, 0x6E02BFBD1BDF17DD, 0x6E7355BB04BE109C, 0x6EE4171452ED7D42, 0x6F55082946D09F21, 0x6FC62E9B88B007D5, 0x70379185413B0852, 0x70A939C09FD12EE8, 0x711B3243AC4D8692, 0x718D88957D1C3023, 0x720026B1C06B6A53, 0x7271CA9FCDF6531F, 0x72E3BCC9487D4436, 0x73560CE8DEFBF234, 0x73C8CE85FADB707A, 0x743C19F3C62C956A, 0x74B006CD07056D36, 0x752267CF76103B6C, 0x75954807E082C4B5, 0x7608C5D92B5838FB, 0x767D07DA7ECB62C6, 0x76F11FA1E0C9F743, 0x776455903AEFD5A0, 0x77D84E466672AD59, 0x784D3E2CB341F88F, 0x78C1B4A51088F17F, 0x793594292C26E653, 0x79AA77BA8027B682, 0x7A2055E51B1882A4, 0x7A944AB297A87248, 0x7B095D5F3D928EDA, 0x7B7FE771CB7257AE, 0x7BF4307602BE5B7C, 0x7C69B5B6477E6880, 0x7CE07868C5CCFAF2, 0x7D553B370EFA3B7C, 0x7DCB88CB676C8525, 0x7E41F63CB077CADB, 0x7EB7932FA79D3A3F, 0x7F2F2054EB4D96E7, 0x7FA4AB7864418635 + }; /// /// Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up