c++ - 在 C++ 中混淆 "double to long long"

标签 c++ double long-long

我的代码:

int main()
{
long long a = pow(2,63) - 1;
long long b = pow(2,63);
double c  = pow(2,63) - 1;
double d = pow(2,63);
printf("%lld %lld \n%f %f \n%lld %lld\n", a, b, c, d, (long long)c, (long long)d);

return 0;
}

执行结果是(在 win7 x64 中使用 gcc 的代码块):

9223372036854775807 9223372036854775807
9223372036854775800.000000 9223372036854775800.000000
-9223372036854775808 -9223372036854775808

问题:

为什么 a == b

我知道 c == d 因为 double 的精度。

但为什么 (long long)c(long long)d 不是 9223372036854775800

为什么 (long long)c != a(long long)d != b

最佳答案

pow(2,63) - 1 都是用 double 浮点运算完成的。特别是,-1 被转换为 -1.0,这太小了,无关紧要

关于c++ - 在 C++ 中混淆 "double to long long",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249975/

相关文章:

c++ - 为什么我在 double 之间的比较失败了 C++

java - java.lang.Double 的精度损失

c++ - 无符号 _int64 的 sprintf

c++ - Unresolved external

c++ - 遍历二维数组的所有子数组

c++ - 混用 std: :'s and boost::' s::bind 和::function 会导致问题吗?

Java 和 double 的大小

C++ 为什么 LLONG_MIN == -LLONG_MIN

c++ - 64 位整数和旧的 C++ 编译器

c++ - C++中如何删除链表的第一个节点