Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В .NET нет эффективной реализации длинной арифметики.…
using (var mathAssembly = new MathAssembly("b(x) + 10 * x * a", "x"))
{
var b = new Func<double, double>(x => x * x);
var funcResult = mathAssembly.Func(5, 2, b); // x = 5; a = 2; b = x ^ 2
// funcResult == 5 ^ 2 + 10 * 5 * 2 = 125
var funcDerResult = mathAssembly.FuncDerivative(5, 2, b); // x = 5; a = 2; b = x ^ 2
// funcDerResult == (b(x + dx) - b(x)) / dx + 10 * a = 30
}
А вот в аналитических преобразованиях я дальше производных тоже не двинулся. Интересно было бы посмотреть LGPL код подобной библиотеки.
Финальный IL код является более оптимальным, по сравнению с кодом, сгенерированным стандартным C# компилятором csc.exe в Release режиме, достаточно всего лишь взглянуть на сравнение следующих двух листингов например для функции
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,10h
00000006 fld qword ptr [ebp+8]
00000009 fld st(0)
0000000b fld1
0000000d fmulp st(1),st
0000000f sub esp,8
00000012 fstp qword ptr [esp]
00000015 fstp qword ptr [ebp-8]
00000018 call 723800FB
0000001d fld qword ptr [ebp-8]
00000020 fxch st(1)
00000022 fmul dword ptr ds:[013A3608h]
00000028 fsin
0000002a fld st(1)
0000002c fmul st,st(2)
0000002e fmul st,st(2)
00000030 faddp st(1),st
00000032 fld st(1)
00000034 sub esp,8
00000037 fstp qword ptr [esp]
0000003a fld st(1)
0000003c sub esp,8
0000003f fstp qword ptr [esp]
00000042 fstp qword ptr [ebp-8]
00000045 fstp qword ptr [ebp-10h]
00000048 call 723800FB
0000004d fld qword ptr [ebp-10h]
00000050 fxch st(1)
00000052 fmul dword ptr ds:[013A3610h]
00000058 fsin
0000005a fmul dword ptr ds:[013A3618h]
00000060 sub esp,8
00000063 fstp qword ptr [esp]
00000066 fstp qword ptr [ebp-10h]
00000069 call 723800FB
0000006e fld qword ptr [ebp-10h]
00000071 sub esp,8
00000074 fxch st(1)
00000076 fstp qword ptr [esp]
00000079 fstp qword ptr [ebp-10h]
0000007c call 724D0466
00000081 fld qword ptr [ebp-10h]
00000084 fld qword ptr [ebp-8]
00000087 faddp st(2),st
00000089 fld st(0)
0000008b fmul dword ptr ds:[013A3620h]
00000091 fmul st,st(1)
00000093 fmulp st(1),st
00000095 fsubp st(1),st
00000097 mov esp,ebp
00000099 pop ebp
0000009a ret 8
00000038 vmovsd xmm0,qword ptr [rbp+000000B0h]
00000041 vmovsd xmm1,qword ptr [rbp+000000B0h]
0000004a vmulsd xmm0,xmm0,xmm1
0000004f vmovsd xmm1,qword ptr [rbp+000000B0h]
00000058 vmulsd xmm0,xmm0,xmm1
0000005d vmovsd qword ptr [rbp+78h],xmm0
00000063 vmovsd xmm0,qword ptr [000001B8h]
0000006c vmovsd qword ptr [rbp+70h],xmm0
00000072 vmovsd xmm0,qword ptr [rbp+000000B0h]
0000007b vmulsd xmm0,xmm0,mmword ptr [000001C0h]
00000084 call 000000005FCD3BA0
00000089 vmovsd qword ptr [rbp+68h],xmm0
0000008f vmovsd xmm0,qword ptr [rbp+70h]
00000095 vmovsd xmm1,qword ptr [rbp+68h]
0000009b vmulsd xmm0,xmm0,xmm1
000000a0 call 000000005F65C6F0
000000a5 vmovsd qword ptr [rbp+60h],xmm0
000000ab vmovsd xmm0,qword ptr [rbp+78h]
000000b1 vmovsd xmm1,qword ptr [rbp+60h]
000000b7 vaddsd xmm0,xmm0,xmm1
000000bc vmovsd qword ptr [rbp+58h],xmm0
000000c2 vmovsd xmm0,qword ptr [rbp+000000B0h]
000000cb vmovsd qword ptr [rbp+50h],xmm0
000000d1 vmovsd xmm0,qword ptr [000001C8h]
000000da vmovsd qword ptr [rbp+48h],xmm0
000000e0 vmovsd xmm0,qword ptr [000001D0h]
000000e9 vmovsd qword ptr [rbp+40h],xmm0
000000ef vmovsd xmm0,qword ptr [rbp+000000B0h]
000000f8 call 000000005FCD3BA0
000000fd vmovsd qword ptr [rbp+38h],xmm0
00000103 vmovsd xmm0,qword ptr [rbp+40h]
00000109 vmovsd xmm1,qword ptr [rbp+38h]
0000010f vmulsd xmm0,xmm0,xmm1
00000114 call 000000005F65C6F0
00000119 vmovsd qword ptr [rbp+30h],xmm0
0000011f vmovsd xmm0,qword ptr [rbp+48h]
00000125 vmovsd xmm1,qword ptr [rbp+30h]
0000012b vmulsd xmm0,xmm0,xmm1
00000130 call 000000005FCD3BA0
00000135 vmovsd qword ptr [rbp+28h],xmm0
0000013b vmovsd xmm0,qword ptr [rbp+50h]
00000141 vmovsd xmm1,qword ptr [rbp+28h]
00000147 call 000000005FCD3BC8
0000014c vmovsd qword ptr [rbp+20h],xmm0
00000152 vmovsd xmm0,qword ptr [rbp+58h]
00000158 vmovsd xmm1,qword ptr [rbp+20h]
0000015e vaddsd xmm0,xmm0,xmm1
00000163 vmovsd xmm1,qword ptr [rbp+000000B0h]
0000016c vmulsd xmm1,xmm1,mmword ptr [000001D8h]
00000175 vmovsd xmm2,qword ptr [rbp+000000B0h]
0000017e vmulsd xmm1,xmm1,xmm2
00000183 vmovsd xmm2,qword ptr [rbp+000000B0h]
0000018c vmulsd xmm1,xmm1,xmm2
00000191 vsubsd xmm0,xmm0,xmm1
00000196 vmovsd qword ptr [rbp+00000080h],xmm0
0000019f nop
000001a0 jmp 00000000000001A2
000001a2 vmovsd xmm0,qword ptr [rbp+00000080h]
000001ab lea rsp,[rbp+00000090h]
000001b2 pop rsi
000001b3 pop rdi
000001b4 pop rbp
000001b5 ret
Стоит отметить, что все-таки точности стандартных математических функций и типа double не хватает для нормального распознавания рациональных и вещественных чисел, однако теоретически все работает.
Математические выражения в .NET (разбор, дифференцирование, упрощение, дроби, компиляция)