У меня есть различные методы накопления величин в числовых значениях фиксированной точности на основе следующего типа данных:
Числа отсчитываются вперед в x до тех пор, пока они не выходят за пределы и не повторяются, после чего y накапливает +1 для переполнения и -1 для опустошения . (У меня также есть методы для добавления чисел с плавающей запятой, что может вызвать несколько переполнений или опустошений x и, таким образом, несколько раз накапливаться в y).
Методы добавление или вычитание в этом типе данных в некоторой степени затруднено.
Код: Выделить всё
int95_t sum(const int95_t a, const int95_t b) {
int95_t result = { a.x + b.x, a.y + b.y };
result.y += (1 - (2 * (b.x < 0LL))) * ((a.x ^ result.x) < 0 && (a.x ^ b.x) >= 0LL) * 2;
return result;
}
int95_t subtract(const int95_t a, const int95_t b) {
const int95_t neg_b = { -b.x, -b.y + (2 * (b.x == LLONG_MIN)) };
return sum(a, neg_b);
}
Я перегрузил операторы +, -, += и -= для этого типа данных, но это не Это не поможет сильно очистить мой код по следующей причине: во многих контекстах я буду хранить не массив значений int95_t, а два отдельных массива long long int и int значения. (Причина в том, что существует множество условий, при которых дополнительный аккумулятор y можно безопасно игнорировать, и я хочу сохранить пропускную способность памяти.) Таким образом, у меня есть много ситуаций, когда для добавления одного int95_t к еще одно в данных обстоятельствах мне, кажется, все равно нужно было бы сделать:
Код: Выделить всё
long long int primary[8];
int secondary[8];
int95_t add_this = { 81573835283, 3816 };
for (int i = 0; i < 8; i++) {
int95_t tmp = { primary[i], secondary[i] };
tmp += add_this;
primary[i] = tmp.x;
secondary[i] = tmp.y;
}
Есть ли лучший способ? Я надеюсь, что смогу рассчитывать на то, что любой компилятор C++ правильно интерпретирует что-то подобное в приведенном выше случае, но я не уверен:
Код: Выделить всё
for (int i = 0; i < 8; i++) {
{ primary[i], secondary[i] } += add_this;
}
Спасибо за любую помощь, которую вы можете предложить.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... underlying