我有多种方法可以根据以下数据类型累积固定精度数值的数量:
int95_t {
long long int x;
int y;
};
数字向前计数,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 添加到另一个 int95_t,似乎我仍然需要这样做:+=
-=
int95_t
long long int
int
y
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;
}
谢谢大家提供的帮助。
解决方案之一可能是创建一个具有重载算法的临时对象,该对象保存对操作数组件的引用。例如:
您还可以重新使用此类来
int95_t
实现重载运算符,即