【问题标题】:Optimize dataset for floating point add/sub/mul/div优化数据集的浮点加/子/mul/div
【发布时间】:2018-11-03 03:13:31
【问题描述】:

假设我们有一个数字数据集,我们想使用计算机使用加法/减法/乘法/除法对其进行一些计算。

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

就真实->FP 映射的绝对精度而言,“空洞”向更大的数字增长,在 0 附近有一个奇怪的空洞,具体取决于架构。因此,对较大数字的加/减精度会下降。

如果我们将浮点表示中表示的 2 个连续数字相除,则除法的结果将更大,无论是在处理更大的数字时,还是在处理越来越小的分数时。

所以,我的问题是:

现在普通 PC 上的浮点数是否存在“甜蜜区间”,其中使用上述运算符 (add/sub/mul/div) 的算术结果更精确?

如果我有一个包含许多有效数字的数据集,例如"123123123123123""134534513412351151" 等,我想用它做一些算术运算,将其转换为哪个浮点间隔,以获得结果的最佳精度?

  • 由于浮点数类似于1.xxx*10^yyy2.xxx*10^yyy、...、9.xxx*10^yyy,我认为,将我的数字转换为 [1, 9] 区间将为消耗的内存提供最佳结果,但我可能大错特错...

假设我使用 C,甚至可以进行这样的转换吗?是否有最佳实践来做到这一点?在操作之前,C 会将操作数转换为相同的格式,所以我想我必须使用字符串表示,注入一个“。”某处并将其解析为浮点数。

请注意:

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

请不要让我回答“这个无法回答,因为它取决于实际操作,因为结果可能在原始数据之外的另一个幅度范围内,等等等等。”。让我们假设计算的结果与操作数或多或少在相同的区间内。当然,当划分“或多或少相同大小”的操作数时,结果将在 1-10 之间,可能是 0.1-100,... ,但这可能正是它们可以处于的最佳区间。

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

【问题讨论】:

    标签: math floating-point precision


    【解决方案1】:

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

    如果您按非 2 的幂进行缩放,则结果可能会有所不同,因为有效数字发生了变化。影响通常很小,结果是好是坏实际上是随机的,除非在精心设计的特殊情况下。

    【讨论】:

    • Nitpick:对于足够小的值,相对精度会降低,以至于它们不能存储为规范化的浮点数,但需要存储为次正规(又名“非正规”)浮点数。可以说这属于“下溢的影响”,但可能值得明确指出,因为我在实际用例中曾多次遇到过这种情况,这是比预期更大的错误的根源,其根本原因只是确定经过仔细的范围分析。单精度 (IEEE-754 binary32) 数据最常出现此问题。
    • 我理解正确吗:在缩放数据集上进行算术运算时,我得到较小的绝对误差(0.01 而不是 100),但是当它重新放大时,误差会增加,好像它们以原始幅度进行。这是由于浮点数在相对或对数意义上是均匀分布的,因此在相对意义上,表示的实数在任何区间都不是“更密集”。
    • 所以可能唯一一次应该尝试优化算术是在对大但非常相似的数字执行减法时,然后它不应该是缩放,而是“移位”:从中减去相同的数字每个大数通过非算术方法,这样小的结果数不会因为这些大数的绝对表示的误差而丢失。
    • @ZoltanK.:同意您的第一条评论。关于大但相似的数字的减法,当减去两个相同符号的数字时没有错误,使得较小的数字至少是较大的一半。浮点减法的结果是精确的数学结果。其中的任何错误都是这两个数字中已经存在的错误。因此,此时没有替代技术可以产生更好的结果。在进行减法之前,有必要更精确地计算数字。
    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多