Math 优化浮点add/sub/mul/div的数据集

Math 优化浮点add/sub/mul/div的数据集,math,floating-point,precision,Math,Floating Point,Precision,假设我们有一个数字数据集,我们想用它在计算机上做一些加法/减法/乘法/除法运算 浮点表示法对实数的覆盖范围变化很大,具体取决于所表示的数字: 就real->FP映射的绝对精度而言,孔朝着更大的数字增长,根据架构的不同,在0附近有一个奇怪的孔。因此,对较大数字的加法/子程序精度将下降 如果我们将浮点数表示法中表示的两个连续数字相除,则除的结果将变大,同时也将变小 所以,我的问题是: 今天,普通PC上的浮点运算是否有一个甜蜜的间隔,其中使用上述运算符add/sub/mul/div的算术结果更精确 如

假设我们有一个数字数据集,我们想用它在计算机上做一些加法/减法/乘法/除法运算

浮点表示法对实数的覆盖范围变化很大,具体取决于所表示的数字:

就real->FP映射的绝对精度而言,孔朝着更大的数字增长,根据架构的不同,在0附近有一个奇怪的孔。因此,对较大数字的加法/子程序精度将下降

如果我们将浮点数表示法中表示的两个连续数字相除,则除的结果将变大,同时也将变小

所以,我的问题是:

今天,普通PC上的浮点运算是否有一个甜蜜的间隔,其中使用上述运算符add/sub/mul/div的算术结果更精确

如果我有一个由许多有效数字组成的数据集,比如123123、134534513412351151等,我想用它做一些算术运算,它应该转换成哪个浮点区间,以获得结果的最佳精度

由于浮点数类似于1.xxx*10^yyy,2.xxx*10^yyy,…,9.xxx*10^yyy,因此我假设,将我的数字转换为[1,9]间隔将为消耗的内存提供最佳结果,但我可能大错特错了。。。 假设我使用C,这样的转换还能实现吗?有这样做的最佳实践吗?在操作之前,C将把操作数转换成相同的格式,所以我想我必须使用字符串表示,注入一个。然后将其解析为float

请注意:

这是一个理论上的问题,我手头没有一个实际的数据集来决定什么是最好的。同样的,提到C是随机的,我也对像忘记C这样的回答感兴趣,我会使用这个和这个,因为它支持这个和这个

请不要回答这样无法回答的问题,因为这取决于实际操作,因为结果可能在原始数据之外的另一个量级范围内,等等。。让我们假设计算结果与操作数大致在同一时间间隔内。当然,当对大小大致相同的操作数进行除法时,结果将在1-10之间,可能是0.1-100,但这可能正是他们能进入的最佳间歇期


当然,如果答案包括一些解释,而不是拒绝,我会很乐意阅读它

由于指数的变化,浮点数的绝对精度随数字的大小而变化。相对精度不变,但指数范围底部附近出现下溢的数字除外。如果将二进制浮点数乘以二的幂,执行针对缩放进行适当调整的算术运算,并反转缩放,则结果将与在不缩放的情况下执行算术相同,从而阻止溢出和下溢的影响。如果您的算法确实涉及下溢或上溢,那么缩放有助于避免这种情况。例如,如果您的精度受到影响,因为您的数字太小,以致某些中间结果低于浮点格式的正常范围,则按二的幂进行缩放可以避免因下溢而导致精度损失


如果不是按二的幂进行缩放,由于有效位的变化,结果可能会不同。影响通常很小,结果是好是坏实际上是随机的,除非在精心设计的特殊情况下。

由于指数变化,浮点数的绝对精度随数字的大小而变化。相对精度不变,但指数范围底部附近出现下溢的数字除外。如果将二进制浮点数乘以二的幂,执行针对缩放进行适当调整的算术运算,并反转缩放,则结果将与在不缩放的情况下执行算术相同,从而阻止溢出和下溢的影响。如果您的算法确实涉及下溢或上溢,那么缩放有助于避免这种情况。例如,如果您的精度受到影响,因为您的数字太小,以致某些中间结果低于浮点格式的正常范围,则按二的幂进行缩放可以避免因下溢而导致精度损失


如果不是按二的幂进行缩放,由于有效位的变化,结果可能会不同。影响通常很小,结果是好是坏实际上是随机的,除非是在精心设计的特殊情况下。

挑剔:较小值的相对精度会降低
h表示它们不能存储为标准化浮点数,但需要存储为低于标准的a.k.a.非标准化浮点数。可以说,这属于下溢的影响,但可能值得明确指出,因为我在实际使用案例中多次遇到过这一点,因为这是比预期更大的错误的来源,其根本原因只有在仔细的范围分析之后才能确定。这个问题在单精度IEEE-754 binary32数据中最常见。我是否正确理解了它:在缩放数据集上进行算术运算时,我得到的绝对误差较小,为0.01,而不是100,但当将其放大时,误差会增大,就好像它们是按照原始大小执行的一样。这是因为浮点数在相对或对数意义上是均匀分布的,所以在相对意义上,表示的实数在任何间隔内都不密集。因此,可能唯一应该尝试优化算法的时间是在对大但非常相似的数字执行减法时,然后不应该进行缩放,而是移位:通过非算术方法从每个大数字中减去相同的数字,这样小的结果数字就不会因为这些大数字的绝对表示错误而丢失。@ZoltanK:你的第一条评论是肯定的。关于对较大但相似的数字进行减法,将两个相同符号的数字相减,使得较小的数字至少是较大的一半,这是没有错误的。浮点减法的结果就是精确的数学结果。其中的任何错误都是两个数字中已经存在的错误。因此,在这一点上,没有任何替代技术能够产生更好的结果。在进行减法之前,有必要更精确地计算数字。挑剔:对于小到不能存储为标准化浮点数,但需要存储为低于标准a.k.a.非标准化浮点数的值,相对精度会降低。可以说,这属于下溢的影响,但可能值得明确指出,因为我在实际使用案例中多次遇到过这一点,因为这是比预期更大的错误的来源,其根本原因只有在仔细的范围分析之后才能确定。这个问题在单精度IEEE-754 binary32数据中最常见。我是否正确理解了它:在缩放数据集上进行算术运算时,我得到的绝对误差较小,为0.01,而不是100,但当将其放大时,误差会增大,就好像它们是按照原始大小执行的一样。这是因为浮点数在相对或对数意义上是均匀分布的,所以在相对意义上,表示的实数在任何间隔内都不密集。因此,可能唯一应该尝试优化算法的时间是在对大但非常相似的数字执行减法时,然后不应该进行缩放,而是移位:通过非算术方法从每个大数字中减去相同的数字,这样小的结果数字就不会因为这些大数字的绝对表示错误而丢失。@ZoltanK:你的第一条评论是肯定的。关于对较大但相似的数字进行减法,将两个相同符号的数字相减,使得较小的数字至少是较大的一半,这是没有错误的。浮点减法的结果就是精确的数学结果。其中的任何错误都是两个数字中已经存在的错误。因此,在这一点上,没有任何替代技术能够产生更好的结果。在进行减法之前,有必要更精确地计算数字。