我正在设计硬件,以执行符合IEEE-754标准的浮点运算。 SoftFloat是一个库(由John Hauser-UC Berkeley编写)是IEEE-754浮点行为的参考模型(在C ++中)。它实现了执行标准指定的所有浮点计算的功能。我想使用SoftFloat为我的硬件实现生成测试用例。作者页面的链接为http://www.jhauser.us/arithmetic/SoftFloat.html。
我从该页面上的链接(http://www.jhauser.us/arithmetic/SoftFloat-3e.zip)下载了zip文件,将其解压缩,并用来提供Makefile进行构建。我在Windows10上以bash运行。在构建过程结束时,我将获得一个存档文件“ softfloat.a”。
SoftFloat实现的功能之一是融合浮点乘加。根据文档,可以通过调用f32_mulAdd函数来调用它,并且它的模板在提供的头文件softfloat.h中。
在我的主代码(sf.cc)中,包括该标头,使用在同一标头中定义的类型定义该函数的参数,并使用以下代码构建代码:
gcc -o sf -I. sf.cc softfloat.a
这会出现以下错误:
/tmp/ccALxpC8.o: In function `main':
sf.cc:(.text+0x4f): undefined reference to `f32_mulAdd(float32_t, float32_t, float32_t)'
collect2: error: ld returned 1 exit status
f32_mulAdd IS是在softfloat.h中定义的(我已选中),并且归档文件softfloat.a中确实包含f32_mulAdd.o(已通过ar -t softfloat.a检查)和SoftFloat源代码中的f32_mulAdd.c来定义函数(如“ float32_t f32_mulAdd(float32_t a,float32_t b,float32_t c)”),并且我对该函数的调用与定义一致,所以我不明白为什么收到此消息。如果有人使用过SoftFloat,请发出提示音。
我在其中调用SoftFloat函数f32_mulAdd的源代码如下(我希望首先对其进行干净地编译/链接,然后再添加语句以初始化变量乘数,被乘数并加成特定值): / p>
#include "platform.h"
#include "internals.h"
#include "softfloat.h"
#include "softfloat_types.h"
int float_rounding_mode = 0;
int main()
{
uint8_t rounding_mode;
uint8_t exceptions;
uint32_t multiplier, multiplicand, addend, result;
float32_t f_multiplier, f_multiplicand, f_addend, f_result;
f_multiplier.v = multiplier;
f_multiplicand.v = multiplicand;
f_addend.v = addend;
softfloat_roundingMode = rounding_mode;
softfloat_exceptionFlags = 0;
softfloat_detectTininess = softfloat_tininess_beforeRounding;
f_result = f32_mulAdd(f_multiplier, f_multiplicand, f_addend);
result = f_result.v;
exceptions = softfloat_exceptionFlags & 0x1f;
return 0;
}
答案 0 :(得分:3)
生活和学习!关键是将头文件包含内容更改为:
extern "C" {
#include "softfloat.h"
}
Also, softfloat.h was the only header file required.
答案 1 :(得分:-2)
不需要使用softfloat库。
GCC编译器已经具有浮点实现。
例如-您可以对浮点类型执行A + B运算,您应该得到结果。
您也可以使用pipenv
控制舍入模式,并使用获取异常。