Eng*_*999 1 c double casting type-conversion uint64
当从大的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;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
var64 = 844421103279395000
varDouble = 844421103279394940.000000
Run Code Online (Sandbox Code Playgroud)
A double,假设它使用 IEE754 双精度表示,只能保存 53 位精度。Auint64_t使用所有 64 位作为值位,这意味着有些值可以精确存储在 a 中uint64_t,但不能精确存储在 a 中double。
在您的示例中,844421103279395000 的十六进制表示形式为0\xe2\x80\xadBB7 FC84 FDCF D0B8\xe2\x80\xac。具有 53 位精度的最接近值是0\xe2\x80\xadBB7 FC84 FDCF D080十进制的 \xe2\x80\xad844421103279394944\xe2\x80\xac 。该值接近显示的值,差异可能是由于printf处理写入有效数字的方式造成的。
| 归档时间: |
|
| 查看次数: |
1791 次 |
| 最近记录: |