C++ 如何检查两个十进制数的乘法是否大于ULONG_MAX?
我需要编写一个函数,如果两个数字的乘法大于ULONG_MAX极限,则返回true。否则返回false 我尝试了以下方法:C++ 如何检查两个十进制数的乘法是否大于ULONG_MAX?,c++,c,C++,C,我需要编写一个函数,如果两个数字的乘法大于ULONG_MAX极限,则返回true。否则返回false 我尝试了以下方法: bool isGtThanULONG_MAX(double A, double B) { double result = A * B; if (result > ULONG_MAX) return true; else { //If this could be due to overflow, then a
bool isGtThanULONG_MAX(double A, double B) {
double result = A * B;
if (result > ULONG_MAX)
return true;
else
{
//If this could be due to overflow, then again check:
double temp = result / A;
if (A != 0 && (temp != B)) {
// overflow handling
return true;
}
return false;
}
}
输出:下面cout语句中的第1行和第4行给出溢出(这显然是错误的输出),其余的在输出中给出无溢出(这是正确的)。
为什么会失败?我遗漏了什么吗?请帮忙
cout << (isGtThanULONG_MAX(10, 0.0000000000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;//OVERFLOW
cout << (isGtThanULONG_MAX(10, 0.000000000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.00000000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.0000000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;//OVERFLOW
cout << (isGtThanULONG_MAX(10, 0.000000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.00000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.0000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.000000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.00000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.0000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.000000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.00000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.0000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.000001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.00001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.0001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.001) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.01) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 0.1) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout << (isGtThanULONG_MAX(10, 1) == true ? "OVERFLOW" : "NO-OVERFLOW") << endl;
cout如果ULONG_MAX
不能准确表示为double
,则会出现问题。例如,如果类型double
使用IEEE表示,并且long
具有64位,则当隐式转换为double
类型进行比较时,ULONG_MAX
将四舍五入到下一个2次方。因此,如果发生这种情况,比较应该是result>=ULONG_MAX
,以确保是gthanulong_MAX(0x1p32,0x1p32)
返回true
,而不是只对32位长有效的
:
#include <float.h>
#include <limits.h>
#include <stdbool.h>
bool isGtThanULONG_MAX(double A, double B) {
double result = A * B;
if (ULONG_MAX + 1.0 == ULONG_MAX)
return result >= ULONG_MAX;
else
return result > ULONG_MAX;
}
#包括
#包括
#包括
bool Isgthanulong_MAX(双A双B){
双结果=A*B;
如果(ULONG_MAX+1.0==ULONG_MAX)
返回结果>=ULONG_MAX;
其他的
返回结果>ULONG_MAX;
}
我看了相关问题,但它们描述了两个整数的乘法。我的案例也涉及十进制数。请看一下cout声明1和4。我需要知道他们为什么失败?请回答。这个问题不是任何问题的重复。嗨,@πάνταῥεῖ, 我只想知道为什么#1和#4 cout语句失败了。在这方面你能帮我吗?使用一个调试器,一步一步地完成程序,然后看看你自己。这不是把无符号类型作为参数的问题的重复。请不要急于回答重复的问题。谢谢。请注意,double
或任何IEEE 754表示形式通常不是一个精确的数字。大多数时候都是近似值。希望你不介意我的编辑。进行向上投票。对于64位long和64位IEEE double,(double)ULONG_MAX==(double)ULONG_MAX+1
。确定吗?试试65536*65535.99999。@n.“代词是m。”。谢谢你指出这个问题。我用显式溢出测试更新了解决方案,该测试由编译器优化。@chqrlie:我不理解“if(ULONG_MAX+1.0==ULONG_MAX)”这个条件。你能告诉我,在if条件下,A&B控件的值是多少吗?