gpt4 book ai didi

algorithm - 64位整数和64位浮点同构表示

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:35 24 4
gpt4 key购买 nike

假设我们有一些序列作为输入。出于性能方面的原因,我们可能希望将其转换为同构表示。为了把它转换成同构表示,我们试图把它转换成相同的类型。在这里,我们只考虑输入中的两种类型——int64float64(在我的简单代码中,我将使用numpy和python;这不是问题的关键——人们可能只考虑64位整数和64位浮点)。
首先,我们可以尝试将所有内容转换为float64
所以我们需要这样的输入:

31 1.2 -1234

转换为 float64。如果我们都 int64我们可以保持它不变(“已经同质”),或者如果发现其他东西,我们将返回“不同质”很直截了当。
但问题就在这里。考虑一点修改后的输入:
31000000 1.2 -1234

想法很清楚-我们需要检查我们的“施法者”是否能够正确地处理绝对值 int64的大值:
format(np.float64(31000000), '.0f')  # just convert to float64 and print

'31000000'

好像一点问题都没有所以我们现在就开始交易吧:
im = np.iinfo(np.int64).max  # maximum of int64 type

format(np.float64(im), '.0f')
format(np.float64(im-100), '.0f')

'9223372036854775808'
'9223372036854775808'

现在它真的不受欢迎-我们失去了一些可能需要的信息也就是说,我们希望保留输入序列中提供的所有信息。
因此,我们的 imim-100值转换为相同的 float64表示。原因很明显- float64在总共64位中只有53个有效位这就是为什么它的精度足以表示 log10(2^53) ~= 15.95即所有16个长度 int64而不丢失任何信息的原因但 int64类型最多包含19位数字。
因此,我们最终得到了大约 [10^16; 10^19](更准确地说是 [10^log10(53); int64.max])的范围,其中每个 int64都可以用信息丢失来表示。
问:在这种情况下,我们应该做出什么样的决定才能均匀地表示 int64float64
我现在看到几个选择:
只需将所有 int64范围转换为 float64并“忘记”可能的信息丢失。
这里的动机是“大部分的投入几乎不会是 > 10^16 int64值”。
编辑:这个条款有误导性在明确的表述中,我们不考虑这样的解决方案(但为了完整性而保留它)。
完全不要进行这种自动转换只有在明确指定的情况下。
也就是说,我们同意性能缺陷。对于任何int浮点数组。即使是最简单的第一种情况。
计算在不丢失信息的情况下执行转换到 float64的阈值。在做选角决定时使用它。如果发现 int64高于此阈值-不要转换(返回“不均匀”)。
我们已经计算了这个阈值它是 log10(2^53)圆形的。
创建新类型 "fint64"。这是一个异国情调的决定,但我正在考虑甚至这一个完整性。
这里的动机包括两点。第一种:当用户希望将 intfloat类型存储在一起时,这是常见的情况。二是 float64型结构。我不太明白为什么一个人需要 ~308数字值范围,如果有效位只由 ~16数字组成,而其他 ~292数字本身就是噪声。因此,我们可以使用一个 float64指数位来指示它的 floatint是否存储在这里但是对于 int64来说,丢失1位肯定是个缺点。因为我们的整数范围会缩小两倍但是我们可以在不增加额外开销的情况下,自由存储 ints和 floats。
编辑:虽然我最初认为这是一个“异国情调”的决定,但事实上它只是另一种解决方案的变体——我们表示的复合类型(见5条)但这里需要补充的是,我的第一篇作文有一个明显的缺点,即在 float64int64方面失去了一定的范围我们更愿意做的不是减去1位,而是加上一位,表示存储在后面64位中的 intfloat类型的标志。
正如@Brendan所建议的,可以使用复合类型,由“2个或更多原始类型的组合”组成因此,使用其他原语,我们可以覆盖int64的“问题”范围,并在这种“新”类型中获得同构表示。
编辑:
因为这里出现的问题,我需要尝试非常具体:设计的应用程序在问题中做以下事情-如果可能的话,将 int64float64的序列转换为一些均匀的无损表示。这些解决方案按性能进行比较(例如,表示所需的总内存过多)仅此而已这里不考虑任何其他需求(因为我们应该考虑一个处于最小状态的问题——而不是编写整个应用程序)相应地,在同质无损状态下表示我们的数据的算法(我们确信我们没有丢失任何信息)适合我们的应用程序。
我决定把“app”和“user”两个词从问题中去掉——这也是一种误导。

最佳答案

选择数据类型时有3个要求:
如果值可能有不同的符号
所需精度
所需范围
当然,硬件并没有提供很多可供选择的类型;所以您需要选择下一个最大的提供类型。例如,如果要以8位精度存储0到500之间的值;那么硬件不会提供类似的功能,您需要使用16位整数或32位浮点。
当选择同质表示时,有3个要求:
如果值可能有不同的符号;根据所代表的所有原始类型的要求确定
所需的精度;根据所代表的所有原始类型的要求确定
所需范围;根据所代表的所有原始类型的要求确定
例如,如果你有整数从10到10000000000,你需要一个不存在的35位整数类型,所以你将使用64位整数,如果你需要2到2的浮点值到31位,那么你需要一个不存在的33位浮点类型,所以你将使用一个64位浮点类型;从这两个原始类型的需求中,你会知道一个同构的表示需要一个符号标志,一个33位的有效值(带有隐含的位)和一个1位的指数,这是不存在的,所以你将使用64位浮点类型作为同构表示。
但是,如果您对原始数据类型的要求一无所知(并且只知道无论这些要求是什么,它们都会导致选择64位整数类型和64位浮点类型),那么您将不得不假设“最坏情况”。这导致需要具有符号标志、62位精度(加上隐含的1位)和8位指数的齐次表示当然,这个71位浮点类型不存在,所以您需要选择下一个最大类型。
还要注意,有时硬件不支持“下一个最大类型”当这种情况发生时,您需要使用“组合类型”-两个或更多基本类型的组合。这可以包括任何小于或等于“大有理数”(以“分子/除数*(1<<指数)”形式由3个大整数表示的数字)。
当然,如果原始类型(64位整数类型和64位浮点类型)是基元类型,并且同构表示需要使用“组合类型”;那么您的“出于性能原因,我们可能希望在同构表示中转换它”假设可能是错误的(出于性能原因,您希望避免使用同构表示)。
换句话说:
如果您对原始数据类型的要求一无所知,那么出于性能原因,您可能希望避免使用同构表示。
现在。。。
让我们将您的问题重新表述为“如何处理设计失败(选择不符合要求的错误类型)”只有一个答案,那就是避免设计失败。运行时检查(例如,如果转换为同构表示导致精度损失,则引发异常)除了通知开发人员设计失败之外,没有其他用途。

关于algorithm - 64位整数和64位浮点同构表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57186803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com