gpt4 book ai didi

c - 显式 int32 -> float32 Casting 的规则

转载 作者:行者123 更新时间:2023-12-04 05:57:56 24 4
gpt4 key购买 nike

我有一个家庭作业来模拟浮点转换,例如:

int y = /* ... */;
float x = (float)(y);

. . .但显然没有使用类型转换。那很好,我不会有问题,除非我找不到任何具体的、具体的定义来说明这种强制转换应该如何操作。

我写了一个运行良好的实现,但它偶尔不完全匹配(例如,它可能在指数中放置一个值 3 并用 1 填充尾数,但“基本事实”将有一个值指数中的四,并用零填充尾数)。两者是等价的(按无穷级数排序)这一事实令人沮丧,因为位模式仍然是“错误的”。

当然,我会从分散的网站上得到一些模糊的东西,比如“接近零”,但老实说,我的搜索一直被 C 新手问题阻塞(例如,“什么是类型转换?”,“我什么时候使用它?”)。因此,我找不到适用于显式定义指数和尾数的一般规则。

帮助?谢谢,
伊恩

最佳答案

由于这是家庭作业,我将只发布一些我认为棘手的部分的注释 - 当整数的大小大于浮点数的精度时四舍五入。听起来您已经有了获得指数和尾数的基础知识的解决方案。

我假设您的浮点数表示是 IEEE 754,并且舍入的执行方式与 MSVC 和 MinGW 相同:使用“银行家的舍入”方案(老实说,我不确定标准是否需要该特定的舍入方案; 这是我测试过的)。剩下的讨论假设要转换的 int 大于 0 .负数可以通过处理它们的绝对值并在末尾设置符号位来处理。当然,0在任何情况下都需要特别处理(因为找不到 msb)。

由于尾数中有 24 位精度(包括隐含的 1 用于 msb),整数可达 16777215 (或 0x00ffffff )可以精确表示。除了位移位将事物放在正确的位置并根据位移计算正确的指数之外,没有什么特别特别的事情要做。

但是,如果 int 值中的精度超过 24 位,则需要舍入。我使用以下步骤进行了舍入:

  • 如果丢弃位的最高位是 0 ,没有什么需要做的了。尾数和指数可以单独保留。
  • 如果丢弃位的 msb 是 1 ,并且剩余的丢弃位设置了一个或多个位,尾数需要递增。如果尾数溢出(超过 24 位,假设您尚未删除隐含的 msb),则尾数需要右移,并且指数递增。
  • 如果丢弃比特的msb为1,并且剩余丢弃比特都是0 ,则仅当 lsb 为 1 时才会增加尾数.与情况 2 类似地处理尾数溢出。

  • 由于尾数增量只有在所有 1 时才会溢出's,如果您没有携带尾数的 msb(即,如果您已经将其丢弃,因为它将在最终浮点表示中丢弃),那么尾数增量溢出的情况可以通过简单地修复将尾数设置为零并增加指数。

    关于c - 显式 int32 -> float32 Casting 的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9288241/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com