使用浮点算法表示整数运算的标准保证

时间:2015-03-10 05:12:24

标签: c floating-point-precision c11 floating-point-conversion

我正在研究一些在异构集群上运行的代码。该程序使用3,4或5个32位字(无符号整数)执行区间运算,以表示间隔的高精度边界。在我看来,在某些情况下用浮点表示一些单词可能会产生加速。所以,我的问题分为两部分:

1)C11标准中是否有任何关于准确表示整数范围的保证,以及它们的产品准确表示的输入对的范围是多少?一个乘法误差可能完全改变结果。

2)这甚至是一种合理的方法吗?似乎处理器内的浮点和整数处理的分离将允许数据同时在两个管道中运行,从而提高吞吐量。我对硬件知之甚少,所以我不确定整数和浮点的管道是否真的是分开的,或者,如果它们是,它们是否可以同时使用。

我知道这类事情的有效性取决于平台,但现在我担心这种方法的可靠性。如果它是可靠的,我可以对它进行基准测试,但是我无法证明可靠性。其次,也许这种方法没有什么希望,如果是这样我想知道,所以我可以把重点放在别处。

谢谢!

2 个答案:

答案 0 :(得分:1)

通过<float.h>中定义的宏,您可以了解所有您需要了解的限制,并且仍具有整数精度。在那里你有浮点类型的确切描述,基数为FLT_RADIX,数字为FLT_MANT_DIG等。

正如您所说,这种方法是否有效取决于平台。您应该知道,这很大程度上取决于您拥有的特定处理器,而不仅仅是处理器系列。从一个英特尔或AMD处理器变体到另一个变体,已经存在明显的差异。因此,您基本上会对所有可能性进行基准测试,并拥有决定程序启动的代码,以便使用哪种变体。

答案 1 :(得分:1)

我不了解标准,但似乎您可以假设所有处理器都使用正常的IEEE floating point format。在这种情况下,很容易确定您的计算是否正确。不能由32位float格式表示的第一个整数是16777217(2 24 +1),因此如果所有中间结果都小于(绝对值),{{ 1}}没问题。

反过来也是如此:如果任何中间结果大于2 24 (绝对值)和奇数,float表示将改变它,这对你来说是不可接受的。< / p>

如果您特别担心乘法,请查看被乘数的限制方式。如果一个受到2 11 的限制,另一个被2 13 限制,那么你就没事了(只是勉强)。例如,如果两者都受到2 16 的限制,那么几乎肯定存在问题。为了证明这一点,找一个导致他们的产品超过2 24 的测试用例并且是奇怪的。