繁体   English   中英

从 uint64_t 转换为 double 会导致值不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM