Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查两个十进制数的乘法是否大于ULONG_MAX?_C++_C - Fatal编程技术网

C++ 如何检查两个十进制数的乘法是否大于ULONG_MAX?

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

我需要编写一个函数,如果两个数字的乘法大于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 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控件的值是多少吗?