【发布时间】:2020-09-16 21:39:54
【问题描述】:
我创建了一个名为symmetricDelta() 的简单函数,它“对称地”计算value 和previous 之间的增量。我的意思是:考虑一个数字线,例如0 到 ULLONG_MAX,在这里你连接了数字线的左端和右端......为了确定“对称”增量,假设如果 value - previous 小于跨度的一半,则变化为正,否则假设变化是负面的,我们绕着数字线。
在下面查看uint64_ts 的简单版本:
int64_t symmetricDelta(uint64_t value, uint64_t previous) {
if (value-previous < (1ULL << 63)) {
uint64_t result = value - previous;
return result;
} else {
uint64_t negativeResult = previous - value;
return -1 * negativeResult;
}
}
用法:
uint64_t value = ULLONG_MAX;
uint64_t previous = 0;
// Result: -1, not UULONG_MAX
cout << symmetricDelta(value, previous) << endl;
演示:https://onlinegdb.com/BJ8FFZgrP
其他值示例,为简单起见假设为uint8_t 版本:
symmetricalDifference(1, 0) == 1
symmetricalDifference(0, 1) == -1
symmetricalDifference(0, 255) == 1
symmetricalDifference(255, 0) == -1
symmetricalDifference(227, 100) == 127
symmetricalDifference(228, 100) == -128
我的问题是:我所说的“对称减法”是否有一个“官方”名称?这感觉就像可能已经在 C++ STL 中实现的那种东西,但我什至不知道要搜索什么......
【问题讨论】:
-
-ULLONG_MAX是1。 -
你能举一个例子来说明一些值以及函数应该为这些值产生什么吗?我不太了解您要达到的目标。
-
@NathanOliver:你说得对,我可以选择一个不那么琐碎的例子(从技术上讲,
-ULLONG_MAX是 UDB,如果你在有符号的计算中进行,但要点是)。更新示例。 -
基本上
min(abs(a-b),abs(b-a))是你在做的? -
现在我很困惑乌干达开发银行是如何参与其中的。
标签: c++ stl subtraction integer-overflow underflow