在非IEEE浮点实现中更改尾数的宽度

时间:2014-09-11 09:07:13

标签: c gcc floating-point floating-point-precision

我在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位浮点输出。任何人都有任何经验 实现非标准的单精度浮点数 和/或知道解决方法?

1 个答案:

答案 0 :(得分:1)

高效的浮点数学需要硬件,该硬件旨在支持正在使用的精确浮点格式。在没有这种硬件的情况下,围绕特定浮点格式设计的例程将比容易适应其他格式的例程更有效。 GCC编译器和提供的库旨在与IEEE-754浮点类型一起高效运行,并且不能特别适用于任何其他类型。上述标题的存在不允许程序员请求特定的浮点格式,而只是通知代码将使用什么格式。

如果您不需要72位浮点类型,并且编译器的double类型将以类似合理的方式执行64位数学运算,即使long是36位而不是32,您可以安排一些事情,以便将float值解压缩为四个字double,使用它进行计算,然后重新排列double的位以产生一个float。或者,您可以编写或查找36位浮点库。我不会特别期待GCC或其库包含这样的东西,因为36位处理器现在相当罕见。