栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在下面的代码中从int转换为float时,为什么会有价值损失?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在下面的代码中从int转换为float时,为什么会有价值损失?

float
类型使用与
int
(32位)相同的位数表示比
int
仅表示整数更大范围的浮点数。

这会导致精度下降,因为并非每个

int
数字都可以用来精确表示
float
。仅24位用于表示数字的小数部分(包括符号位),而其他8位用于表示指数。

如果将此

int
值分配给
double
,则不会有任何精度损失,因为它
double
具有64位,并且其中32个以上的位用于表示小数。

这是更详细的说明:

123456789作为int的二进制表示形式是:

00000111 01011011 11001101 0001 0101

使用以下公式从其32位构造一个单精度浮点数:

(-1)^sign * 1.b22 b21 ... b0 * 2^(e-127)

sign
最左边的位在哪里(b31)。b22到b0是小数位,而b30到b23位构成指数e。

因此,将

int
123456789 转换为时
float
,只能使用以下25位:

00000111 01011011 11001101 00010101-    --- -------- -------- -----

我们可以安全地摆脱任何前导零(符号位除外)和任何尾随零。这使您剩下3个最低有效位,我们必须将其删除。我们可以减去5得到123456784:

00000111 01011011 11001101 00010000-    --- -------- -------- -----

或加3得到123456792:

00000111 01011011 11001101 00011000-    --- -------- -------- -----

显然,加3可以得到更好的近似值。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574425.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号