从uint64_t转换为double会导致错误的值。

问题描述 投票:0回答:1

当从一个大的铸造 uint64_t 值为 双重. 结果没有达到预期的效果。为什么会这样,有没有办法解决。我使用的是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;
}

输出结果如下。

var64     = 844421103279395000
varDouble = 844421103279394940.000000
c casting type-conversion double uint64
1个回答
4
投票

A double,假设它使用IEE754双精度表示,只能容纳53位精度。 A uint64_t 使用所有64位作为值位,这意味着有一些值可以准确地存储在一个 uint64_t 不能准确存储在 double.

在您的例子中,844421103279395000的十六进制表示为 0‭BB7 FC84 FDCF D0B8‬. 最接近的53位精度的值是 0‭BB7 FC84 FDCF D080 即十进制的844421103279394944。 这个值与显示的值很接近,其差异可能是由于 printf 处理书写重要数字。

© www.soinside.com 2019 - 2024. All rights reserved.