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

Standard guarantees for using floating point arithmetic to represent integer operations

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

1) C11 标准是否保证准确表示整数范围,以及准确表示输入对的乘积范围?一个乘法错误可能会完全改变结果。

2) 这是一个合理的方法吗?似乎处理器中浮点和整数处理的分离将允许数据 运行 同时通过两个管道,从而提高吞吐量。虽然我对硬件了解不多,所以我不确定整数和浮点数的管道是否真的是独立的,或者,如果它们是独立的,它们是否可以同时使用。

我知道这类事情的有效性取决于平台,但现在我担心这种方法的可靠性。如果它可靠,我可以对其进行基准测试并查看,但我无法证明其可靠性。其次,也许这种方法没有什么希望,如果是这样,我想知道,以便我可以专注于其他地方。

谢谢!

您需要知道的所有信息都可以通过 <float.h> 中定义的宏来了解您可以达到哪些限制并且仍然具有整数精度。那里有浮点类型的确切描述,FLT_RADIX 表示基数,FLT_MANT_DIG 表示位数,等等。

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

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

反之亦然:如果任何中间结果大于 224(绝对值)且为奇数,float 表示将改变它,即你不能接受。

如果您特别担心乘法,请查看被乘数是如何限制的。如果一个被2​​11限制,另一个被213限制,你会没事的(勉强)。例如,如果两者都受到 216 的限制,几乎可以肯定存在问题。为了证明,找一个测试用例导致他们的乘积超过224并且是奇数