[英]Casting from uint64_t to double results in incorrect values
从大的uint64_t值转换为double时。 结果并不如预期。 这是为什么,有没有办法解决它。 我正在使用 gcc 8.3.0
int main
{
uint64_t var64 = 844421103279395000;
printf("var64 = %llu\n", var64 );
double varDouble = (double)var64;
printf("varDouble = %lf\n", varDouble );
return 0;
}
output如下:
var64 = 844421103279395000
varDouble = 844421103279394940.000000
一个double
,假设它使用 IEE754 双精度表示,只能保持 53 位精度。 uint64_t
使用所有 64 位作为值位,这意味着有些值可以完全存储在uint64_t
中,而不能完全存储在double
中。
在您的示例中, 844421103279395000 具有0BB7 FC84 FDCF D0B8
的十六进制表示。 最接近的 53 位精度值是0BB7 FC84 FDCF D080
,即十进制的 844421103279394944。 该值接近显示的值,差异可能是由于printf
如何处理写入有效数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.