【发布时间】:2016-05-10 20:07:52
【问题描述】:
我试图解决一些涉及大数除法的问题。我偶然发现了使用以下方法得到错误结果的某些情况:
LL 结果 = (LL)ceil((double)(a-b)/c),其中 a,b 和 c 是长整数 (LL)。
#include <stdio.h> /* printf */
#include <math.h> /* ceil */
#define LL long long
int main ()
{
LL a= 10000000000000000;
LL aa = 10000000000000000-1;
LL aaa = 10000000000000000+1;
int b = 1;
int c = 1;
printf ( "%Ld\n", (LL)ceil((double)(a-b)/c) );
printf ( "%Ld\n", (LL)ceil((double)(aa-b)/c) );
printf ( "%Ld\n", (LL)ceil((double)(aaa-b)/c) );
return 0;
}
Output:
10000000000000000
9999999999999998
10000000000000000
这开始发生在大于或等于 10^16 且可被 10 整除的整数上。
long long 的上限是~10^18。
那么是什么导致了这个错误呢?
我在 C++14 模式下使用 GCC 5.1(在 ideone.com 上)。
【问题讨论】:
-
您使用的是什么平台和编译器?
-
我尝试了 Ideone(C++ 14) 使用的编译器。这是代码的链接:ideone.com/aT6nem
-
双精度为 52 位 = 15 位。
-
@stark 如果您将此添加为答案,我会投票赞成。
标签: c++ integer long-integer ceil