gpt4 book ai didi

将 IEEE 754 打包比特流转换为浮点单精度

转载 作者:行者123 更新时间:2023-11-30 18:14:13 25 4
gpt4 key购买 nike

我在将 unsigned long 转换为 Float 单精度时遇到问题这是我的问题

我需要在程序中以浮点进行通信,但我所有的内部变量都是无符号长整型,因此我们决定的设计是一切都保持不变(无符号长整型),并且一旦需要给定一个 float 应用程序,我将转换为 float 并传递它。

因此,根据

,所有变量都将具有 IEEE 754 位流

Float converter

我遵循的步骤:

  1. 我获取字符数组中的值
  2. 我将这些位复制到无符号长整型中
  3. 在提供函数调用数据时,我将类型转换为浮点单精度。

在调试器中,我看到步骤 1 和 2 具有相同的位模式(在缓冲区中)

在步骤 3 中,我也看到了相同的二进制模式,但该值没有被解释为 float

输入:21.125

  1. 二进制:01000001101010010000000000000000
  2. 十六进制:0x41a90000
  3. 十进制:1101594624

    Code:
    void ApplicationApi(void * DataPtr)
    {
    (*(float32*)((void*)DataPtr))= unsignedLong_val;
    }

应用程序 DataPtr 中的结果* DataPtr = 1.101594624 * e9

我在这里遗漏了一些东西还是类型案例起作用了?

最佳答案

unsigned long 的字节重新解释为 float 的标准 C 方法是:

y = (union { unsigned long u; float f; }) { x } .f;

这段代码定义了一个复合文字,它是一个 union ,并用x的值初始化该 union ,该值应该是一个unsigned long。然后它访问 union 体的 f 成员,它是一个 float。这个float值被分配给y,它应该是一个float

因此,假设 ApplicationApi 的声明必须保持不变,并且它传递的 void *DataPtr 是将指针转换为 float 的结果 指向 void 的指针,其定义可以是:

void ApplicationApi(void *DataPtr)
{
* (float32 *) DataPtr =(union { unsigned long u; float32 f; }) { unsignedLong_val } .f;
}

关于此代码的注释:

  • 这要求 unsigned longfloat32 具有相同的大小。
  • 不希望 unsignedLong_val 具有文件范围。最好将其作为参数传递。
  • 此代码中没有固有的理由要求 DataPtr 应作为 void * 传递。它可以作为 float32 * 传递。

有关导致此代码的代码的注释:

  • unsigned long 中组装字节的方式可能存在字节序问题。
  • 在目前很少见的 C 实现中,unsigned long 可能具有陷阱值,阻止它被用来保存任意字节。

关于 C 标准和重新解释字节:

  • 通过 union 重新解释字节是 C 2011 (N1570) 6.5.2.3 3 的结果,它表示使用 . 运算符和成员名称的表达式具有指定成员的值。标准的注释 95 表明这可以用于重新解释字节。
  • 另一种受支持的重新解释字节的方法是将指针转换为指向字符类型的指针,并使用新指针复制字节,按照 6.3.2.3 7。(memcpy 有时用于此目的) .)
  • 6.3.2.3 7 仅针对指向字符类型的指针定义此行为。对于其他类型,C 标准通常不定义将指针转换为其他类型的指针并取消引用结果的行为。因此,执行此操作的代码的行为是未定义的。即使它在测试中看起来有效,但稍后可能会由于编译器优化或其他影响而失败。

关于将 IEEE 754 打包比特流转换为浮点单精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372967/

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