Работая над программой решения конечных элементов ради развлечения, я столкнулся с математической задачей, когда площадь треугольника приходилось решать несколько раз для разных треугольных элементов сетки.
Примечание: все это делается в Cython:
Для двумерного случая формула определителя позволяет нам сделать это с помощью наименьшего количества арифметических операций.
Код: Выделить всё
A = 0.5|[x_1(y_2-y_3) + x_2(y_3-y_1) + x_3(y_1-y_2)]|
Однако это будет вызываться один раз для каждого элемента, а в случае адаптивной сетки — и для каждой итерации. Поэтому найти абсолютное значение становится проблемой. Использование функции, которая выполняет сравнения и ветвление if-else, кажется неправильным. Поэтому я подумал, что битовая манипуляция может быть решением, и выбрал этот подход.
Код: Выделить всё
from libc.stdint cimport uint64_t
cdef union DoubleIntUnion:
double double_nr
uint64_t int_nr
cdef double fastABS(double number) nogil:
cdef DoubleIntUnion u_number
u_number.double_nr = number
u_number.int_nr &= 0x7FFFFFFFFFFFFFFF
return u_number.double_nr
это работает. Но есть ли способ сделать это лучше в этом случае или какие-либо предложения?
Подробнее здесь:
https://stackoverflow.com/questions/789 ... f-a-double