确定乘法输出是否符合64位的最大值
determine if multiplication output fits into max value of 64 bits
我有一个乘法行,它可以产生大于64位的输出值。(我最多能hold住)。
我想确定确定输出是否大于64位的最佳方法是什么
我已经尝试了一些事情,比如。
uint64_t val1, val2, val3;
if ((val1 * val2 * val3 ) > UINT64_MAX) {
//warning message
}
else {
//do something
}
变量初始化为一些值
两个任意大小的无符号整数(!)的乘法a * b
,我们称其为T
,当且仅当结果大于T
所能容纳的最大数字时将溢出。标准库可以使用std::numeric_limits
访问任何类型T
的最大数量。
上面的语句也可以写成:当且仅当a > max(T) / b
与b > max(T) / a
相同(其中/
是整数除法,max(T)
是T
所能容纳的最大数),a * b
会溢出
例子:我们说T = uint8_t
,所以max(T) == 255
。下面是几个演示示例:
a | 16 | 15 | 14
b | 16 | 17 | 18
---------------------------------
a * b | 256 | 255 | 252
overflow? | yes | no | no
---------------------------------
max(T)/b | 15 | 15 | 14
a > max(T)/b? | yes | no | no
使用此方法检查乘法a * b
是否会溢出:
#include <limits.h>
template<typename T>
bool multiplicationWillOverflow(T a, T b) {
return a > std::numeric_limits<T>::max() / b;
}
然后,对三个数的乘积使用此方法两次:
uint64_t val1, val2, val3;
if (multiplicationWillOverflow(val1, val2)) {
//warning message
}
uint64_t product12 = val1 * val2,
else if (multiplicationWillOverflow(product12, val3)) {
//warning message
}
uint64_t product123 = product12 * val3;
另一种选择是将乘法和检入封装为一个方法。如果发生溢出,则抛出异常。
template<typename T>
T safeMultiplication(T a, T b) {
if (a > std::numeric_limits<T>::max() / b)
throw ...;
else
return a * b;
}
您可以将此行为封装在自定义类型中,该类型重载算术运算符并在发生溢出时抛出。
如果你认为溢出是"正常行为"/在"正常情况下",不要使用异常。在这种情况下,请在自定义类型中使用错误参数/标志。
在NaN
异常状态下的浮点算术中也有类似的事情:用NaN
值继续计算将再次得到NaN
。在自定义类型中标记溢出的类似实现将确保您可以轻松地检测链式计算中的溢出,例如三个数字的乘积。自定义类型的关键在于,您不必编写要计算的表达式两次:作为计算本身加上预先的溢出检查。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 查找包含 N 个元素的数组的最小值和最大值
- 井字游戏具有奇怪行为的最小最大值算法(C++)
- C++按位运算,最大值为 12 位整数
- 确定乘法输出是否符合64位的最大值