永发信息网

浮点数是如何转换成ieee754代码的

答案:3  悬赏:10  手机版
解决时间 2021-02-20 12:16
  • 提问者网友:练爱
  • 2021-02-20 09:06
在C语言中 输入一个浮点数 是如何转换成ieee754代码的 网上资料都是将ieee754转换成数字 没有逆向转换的 还有就是求移码的问题 将补码的符号位取反得到移码是否适用于任何数字? 还有其他方法求解么?
请高手来解答下
百度上搜的就不要发了 能搜的我都搜过了

我指的是 比如我用float定义一个变量 然后给变量赋个值 系统要把这个数存放到内存中 是用ieee754标准将其转换的 而我正是想知道从我输入的这个数字 到系统将其转换成 符号+阶码+尾数 的过程是怎样的 其中的误差是如何产生的 仅此而已
首先 您的对其的含义我并不是很理解~可能是我计算机哪方面还没学到吧。。。不过看上去很像把十进制数转换成二进制数 能否具体的讲下
其次 对小数部分不能完全转换成2进制会产生误差 这我知道 可是比如 3.3 其小数不能不能完全转化成2进制 但是此C中用FLOAT定义的变量却能存放3.3而没有误差 相反 例如35435543这个数字 根本没有小数 但是C中却不能准确存放 能否讲下为什么
第三 您对阶码部分的转换很直接 但逆向转换时却要考虑 阶码的形式然后再对尾数转换 (其中阶码用的是移码) 如果按照您所说的话 那么+0或-0的转化过程中就会产生问题 我试了下还不是很理解
最佳答案
  • 五星知识达人网友:一把行者刀
  • 2021-02-20 09:44
“网上资料都是将ieee754转换成数字”这个我倒是真搜不到... 严格地说只有一个英文数学向的论文|||(更正 我连那个论文也找不到了)

最简单的方法(除了直接用C库的函数)

float s = 0;

for (;;)
{
s = s * 10 + *p - '0';
}

x.,xb

如果你想硬转的话,我只问你一个问题,把十进制有效数字对齐到二进制有效数字你有概念么,事实上浮点数和字符串装换主要的工作就只是这么一个问题。写程序不是抄抄代码就成的,基本原理你都没概念给你讲有什么用。

----

嘛... 其实已经告诉你了,把十进制有效数字对其到二进制上... 二不能被五整除所以对齐结果可能是无限小数;然后把10底的指数换算成2底的在把对齐时候的偏差也加进去就有了有效数字和指数(因为前面有效数字对齐了所以这个指数肯定是整数)。具体过程既然别人写出来是论文我写出来也不会好看到哪儿去。 论难度的话也就是高考数学大题稍强的水平吧,因为只是高三知识折腾来折腾去x.,x

----

你要理解这么个情况,知道这个算法并且还有闲心逛知道的就算除了我以外还有别人一只手也能数过来。这种没几个人知道的东西你觉得在没有基础铺垫的情况下我可能三言两语跟你说清楚么。所以我一直在给你传达的信息就是别研究这种没什么意义的东西了,实际操作中只要不是想彻底自己实现浮点数和字符串的相互转化,不可能用到这个(这也就是这个并不是特别难的算法为什么没几个人知道的另一方面原因,不过它依然很麻烦)。况且这个根本不是计算机问题而是彻头彻尾的数学问题。
全部回答
  • 1楼网友:往事埋风中
  • 2021-02-20 11:18
将原始数据进行整数化: (17.296875)10*(2^16)10 =(17.296875)10*(65536)10 =(1133568)10 >(1133568)10 //去掉小数,保留整数部分 =(114c00)16 =(0001 0001 0100 1100 0000 0000)2 =(000100010100110000000000)2 因为最初乘了65536,即2的16次方,所以换算成二进制时应右移16位,去掉前导零, 即(10001.00010100110000000000000)2 单精度浮点数保存的字节格式如下: 地址:+0 +1 +2 +3 内容:seee eeee emmm mmmm mmmm mmmm mmmm mmmm 根据ieee浮点数的定义,将上述二进制数规格化: (17.296875)10 >(10001.0100110000000000)2 >+1.00010100110000000000 * (2^4) 符号s为正,等于0 b; 指数eeeeeeee为4+127=131,等于10000011 b; 尾数为00010100110000000000000 b; 合成后为 0 10000011 000 1010 0110 0000 0000 0000 若将上述值表示为十六进制数,则为(41 8a 60 00)16。
  • 2楼网友:三千妖杀
  • 2021-02-20 10:48
(更正 我连那个论文也找不到了) 最简单的方法(除了直接用C库的函数) float s = 0; for (;;) { s = s * 10 + *p - '0'; } x.,xb 如果你想硬转的话,我只问你一个问题,把十进制有效数字对齐到二进制有效数字你有概念么,事实上浮点数和字符串装换主要的工作就只是这么一个问题。写程序不是抄抄代码就成的,基本原理你都没概念给你讲有什么用。 ---- 嘛... 其实已经告诉你了,把十进制有效数字对其到二进制上... 二不能被五整除所以对齐结果可能是无限小数;然后把10底的指数换算成2底的在把对齐时候的偏差也加进去就有了有效数字和指数(因为前面有效数字对齐了所以这个指数肯定是整数)。具体过程既然别人写出来是论文我写出来也不会好看到哪儿去。 论难度的话也就是高考数学大题稍强的水平吧,因为只是高三知识折腾来折腾去x.,x ---- 你要理解这么个情况,知道这个算法并且还有闲心逛知道的就算除了我以外还有别人一只手也能数过来。这种没几个人知道的东西你觉得在没有基础铺垫的情况下我可能三言两语跟你说清楚么。所以我一直在给你传达的信息就是别研究这种没什么意义的东西了,实际操作中只要不是想彻底自己实现浮点数和字符串的相互转化,不可能用到这个(这也就是这个并不是特别难的算法为什么没几个人知道的另一方面原因,不过它依然很麻烦)。况且这个根本不是计算机问题而是彻头彻尾的数学问题。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯