40.1.3. РЕАЛЬНЫЕ ОПЕРАЦИИ




Как правило весь набор транцендентных функций не реализуется аппаратно, а реализуется некоторое подмножество (кроме того работающее только в определенном диапазоне значений аргументов), а все остальные операции делаются библиотечными функциями. Рассмотрим x86 как самую распространенную платформу:


Есть операция FPTAN которая вычисляет два числа X и Y, такие что {X,Y} = FPTAN(z) tg(z) = Y/X ctg(z) = X/Y для вычисления sin и cos: {X,Y} = FPTAN(z/2) sin(z) = 2 * (Y/X) / [ 1 + (Y/X)^2 ] cos(z) = [ 1 - (Y/X)^2 ] / [ 1 + (Y/X)^2 ] sec(z) = 1 / sin(z) cosec(z) = 1 / cos(z) также помним, что: sin(x) = cos(PI/2 - x) tg(z) = - tg(-z) tg(N*PI + x) = tg(x) sin(x)^2 + cos(x)^2 = 1 tg(x) * ctg(x) = 1


Есть операция FPATAN {X,Y} = FPATAN(z) arctg(z) = Y/X arcctg(z) = X/Y arcsin(z) = arctg(z/SQRT([1-z]*[1+z])) arccos(z) = 2 * arctg(SQRT([1-z]/[1+z]))


F2XM1 (2^X)- 1 FYL2X Y * log{2}(X) FYL2XP1 Y * log{2}(X+1) log{e}(X) = log{e}(2) * log{2}(X) log{10}(X) = log{10}(2) * log{2}(X) 2^X = ((2^X) - 1) + 1 e^X = 1 + (2^(X * log{2}(e)) - 1) 10^X = 1 + (2^(X * log{2}(10)) - 1) X^Y = 1 + (2^(Y * log{2}(X)) - 1) Почему именно такие функции: 2^x - 1 ln(1+x) для повышения точности вычислений


Пример реального кода (имеем в виду операнды должны быть в пределах) FTAN FPTAN FDIVP ST(1),ST FSIN FPTAN FMUL ST,ST(0) FLD ST(1) FMUL ST,ST(0) FADD FSQRT FDIVP ST(1),ST


Index Prev Next