gpt4 book ai didi

c - 用 C 语言编写浮点乘法函数

转载 作者:行者123 更新时间:2023-12-02 02:50:53 25 4
gpt4 key购买 nike

在我的计算机科学类(class)中,我被分配编写一个函数,该函数接受两个浮点参数并用 C 语言返回它们相乘的结果

float multiply(float foo, float bar);

除了赋值运算符 = 之外,我不允许使用任何库或任何浮点运算

我了解浮点在 C 中是如何表示的,并且我通过这样做提取了指数和分数:

union sp_item { float frep; unsigned irep; };
union sp_item num;
num.frep = foo;
int exponent = ((num.irep >> 23) - 0x7f);
int frac = (num.irep << 9);

我知道我需要将指数相加(足够简单),然后将两个分数相乘。问题是我不知道从哪里开始计算分数相乘。我正在考虑将分数转换为其十六进制表示形式作为字符串(例如:0.5 将是“80000000”),并编写一个算法来以这种方式乘以位,但由于我无法使用我拥有的任何 C 库不知道我会怎么做。有人能指出我正确的方向吗?

编辑:我发现 float 在所有系统上可能不会以相同的方式表示。在本类(class)中,我们假设第一位是符号,接下来的 8 位是指数,最后 23 位是分数。

编辑:这是我到目前为止所得到的。当我尝试将两个整数相乘时,除非我在调试器监视列表中输入 (long long)((long long)xRep * (long long)yRep) ,否则我只会得到零

#include <stdio.h>
union sp_item
{
float frep;
unsigned irep;
};

int main() {
float x = 0.25;
float y = 0.5;
union sp_item xUnion;
union sp_item yUnion;
xUnion.frep = x; yUnion.frep = y;

unsigned xExp = (xUnion.irep >> 23) - 0x7f;
unsigned yExp = (yUnion.irep >> 23) - 0x7f;

unsigned xRep = (xUnion.irep << 9);
unsigned yRep = (yUnion.irep << 9);


xRep = (xRep >> 1) | 0x80000000;
yRep = (yRep >> 1) | 0x80000000;

long long final = (long long)((long long)xRep * (long long)yRep);

printf("iRep: %x * 2^%d\n", xRep, xExp);
printf("iRep: %x * 2^%d\n", yRep, yExp);
printf("%01611x\n", final);
}

最佳答案

为什么不直接使用整数乘法运算符 * 将分数相乘(提取为 int 表示形式)?

关于c - 用 C 语言编写浮点乘法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724819/

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