c - 如何在 C 中表示 float 的二进制乘法?

标签 c multiplication bit

与整数的二进制乘法算法可以表示如下:

unsigned int multiply(unsigned int multiplier, unsigned int multiplicand) {
    unsigned int product = 0;
    while (multiplier != 0) {
        if ((multiplier & 1) != 0) {
            product = product + multiplicand;
        }
        multiplier = multiplier >> 1;
        multiplicand = multiplicand << 1;
    }
    return product;
}

此函数执行两个不带运算符“*”的无符号整数的乘法。 但是它不适用于 float ,因为 float 由三部分组成:

IEEE 754 single-precision binary floating-point format

这些部分可以隔离如下:

#include <stdio.h>
typedef union {
    float f;
    struct {
        unsigned int mantisa : 23;
        unsigned int exponent : 8;
        unsigned int sign : 1;
    } parts;
} float_cast;

int main() {
    float_cast d1;
    d1.f = 0.15625;
    printf("sign = %x\n",d1.parts.sign);
    printf("exponent = %x\n",d1.parts.exponent);
    printf("mantisa = %x\n",d1.parts.mantisa);
    return 0;
}

通过将部分分隔为整数,我可以操作这些位。但是如何制作一个将 float 的各个部分相乘的函数呢?

提前致谢

最佳答案

  1. 将尾数乘以整数。
  2. 添加指数
  3. 异或符号。

有一些细节。

  1. 尾数都应该归一化,这意味着要么高位为 1,要么尾数为 0。为了完全符合要求,您需要处理非范数和其他特殊情况——无穷大、NaN、零—— - 你可能需要规范化、非规范化或溢出(设置为无穷大)。

  2. 产品在 [1, 4) 范围内,假设值在 [1, 2) 内。如果尾数的乘积大于 2,则需要进行一些修正:将指数递增 1;将两个尾数右移一位。

  3. 指数通常以偏移量存储。假设指数的实际值为 e + m,其中 m 是常量偏移量。两个指数表示的和需要减去m,才能得到乘积的指数。

关于c - 如何在 C 中表示 float 的二进制乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34563092/

相关文章:

java - 关于整数乘法、溢出和信息丢失

C:对可变长度位串的位操作

bit - 当位移操作中有 NOT (~) 时会发生什么

c - C程序初始化中反斜杠有什么用?

java - C 与 Java 原始转换和表达式

javascript - 使用 Javascript 在提示之间创建中断

java - 运算符 * 不能应用于 double

c - 为什么一个复杂的位移命令不像某些具有相同逻辑的命令那样起作用?

c++ - 图中边的顶点之间的最短路径不应是边本身

c - 需要帮助在 C 中将结构传递给本地函数