我在18位软核处理器目标上有一个gcc交叉编译器 具有以下定义的数据类型: 整数18位,长36位和浮点36位(单精度)。 现在我的重点是浮点运算。由于宽度是 非标准(36位),我有以下方案:27位 尾数(有效数字),指数为8位,1位为有效位。 我可以看到宽度是在float.h文件中定义的。感兴趣的 我是以下: FLT_MANT_DIG和FLT_DIG。 它们被定义为:
FLT_MANT_DIG 24 FLT_DIG 6
我已将其更改为
FLT_MANT_DIG 28 FLT_DIG 9
根据我在float.h中的要求,然后构建gcc编译器。但 我仍然得到32位浮点输出。任何人都有任何经验 实现非标准的单精度浮点数 和/或知道解决方法?
答案 0 :(得分:1)
高效的浮点数学需要硬件,该硬件旨在支持正在使用的精确浮点格式。在没有这种硬件的情况下,围绕特定浮点格式设计的例程将比容易适应其他格式的例程更有效。 GCC编译器和提供的库旨在与IEEE-754浮点类型一起高效运行,并且不能特别适用于任何其他类型。上述标题的存在不允许程序员请求特定的浮点格式,而只是通知代码将使用什么格式。
如果您不需要72位浮点类型,并且编译器的double
类型将以类似合理的方式执行64位数学运算,即使long
是36位而不是32,您可以安排一些事情,以便将float
值解压缩为四个字double
,使用它进行计算,然后重新排列double
的位以产生一个float
。或者,您可以编写或查找36位浮点库。我不会特别期待GCC或其库包含这样的东西,因为36位处理器现在相当罕见。