![](/img/trans.png)
[英]How to +1 to the digit if the first decimal is greater than or equal to 5?
[英]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.