草庐IT

9484282305798401

全部标签

c++ - 为什么 std::abs(9484282305798401ull) = 9484282305798400?

我目前正在编写一个模板化的辅助方法,可以将一般的C数字(包括unsignedlonglong)转换为GMP库中的mpz_class数字。在这两者之间,调用了std::abs。然而,事实证明,对于C++17(g++6.3.1),#include#includeintmain(){std::cout给出了错误的输出9484282305798400。据我了解cmath,std::abs首先将参数转换为double值。根据C++文档,double有52个尾数位,这意味着在任何精度损失之前,我必须严格小于2^52=4503599627370496的最大整数值。我的说法是否正确,因为9484282