首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IEEE-754格式化浮点数

使用IEEE-754格式化浮点数
EN

Stack Overflow用户
提问于 2018-04-10 20:55:36
回答 1查看 245关注 0票数 0

我有一个C语言的赋值,它给我一个浮点数,并且必须使用IEEE-754格式打印它:

代码语言:javascript
复制
__(sign)mantissa * 2^(exponent)__

符号为'-‘或’',指数为int值,尾数为浮点值。除了stdio.h中的函数(针对printf函数)之外,我还不能使用struct或任何库中的函数。这应该使用按位操作来完成。

我被赋予两项职能:

  • unsignedToFloat:给出一个无符号的int,返回一个具有相同位的浮点数;
  • floatToUnsigned:给出一个浮点数,返回具有相同位元的无符号int;

在将浮点数表示为无符号int之后,我设法确定了任何浮点数的符号和指数。我还设法确定尾数的比特数。例如,给定浮点数3.75:

代码语言:javascript
复制
> bit representation: 01000000011100000000000000000000;
> sign: 0 (' ');
> exponent = 10000000 (128 - bias = 1)
> mantissa = 11100000000000000000000

现在,在这个示例中,我应该将尾数表示为"1.875“。然而,我一直未能做到这一转变。到目前为止,我已经尝试创建另一个浮点数为0000000mantissa,但它给了我错误的结果(我现在明白了原因)。我被告知尾数在开头有一个1,意思是在这个例子中,尾数会变成1.111,但是我没有被告知如何做到这一点。我试着在网上搜索,但是找不到在尾数开头添加1的任何方法。

我还想通过遍历尾数的每一个部分并得到它的十进制表示,然后添加1来完成这个部分。

代码语言:javascript
复制
> 11100000000000000000000
> as_float = 2^-1 + 2^-2 + 2^-3
> as_float += 1

然而,这种方法似乎非常黑客,缓慢,可能会给我错误的结果。

这么说,我完全没有想法了。我将如何表示浮点数的尾数作为它自己的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 21:15:47

  1. float转换为unsigned int
  2. 清除符号位(使用按位和&)。
  3. 设置指数,使其等于偏差(使用按位、&和OR |)。
  4. 将修改后的值从unsigned int转换为float
  5. 使用printf打印新值。

这是因为清除符号位并将指数设置为偏置使您使用(positive)mantissa * 2^0 = mantissa,因此printf将为您打印尾数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49762724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档