簡體   English   中英

如何檢查兩個十進制數的乘積是否大於 ULONG_MAX?

[英]How to check that multiplication of two decimal numbers is greater than ULONG_MAX?

如果兩個數字的乘積大於ULONG_MAX限制,我需要編寫一個 function 返回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;
}

}

output:以下 cout 語句中的第 1 行和第 4 行給出了 OVERFLOW(這顯然是錯誤的輸出),而 rest 在 Z78E6221F63393D1356DZC81DB 中給出了 NO-OVERFLOW(這是正確的)。 為什么它失敗了? 我錯過了什么嗎? 請幫忙。

    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;

PS - 我在 windows 上的 MS Visual Studio Professional 2015 上嘗試了這個程序。

如果ULONG_MAX不能完全表示為double ,則會出現問題。 例如,如果double類型使用 IEEE 表示並且long有 64 位,則在隱式轉換為double類型進行比較時, ULONG_MAX將四舍五入為 2 的下一個冪。 因此,如果發生這種情況,比較應該是result >= ULONG_MAX以確保isGtThanULONG_MAX(0x1p32, 0x1p32)返回true ,而不是僅適用於 32 位 long 的>

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM