Jos*_*ngs 3 python compression floating-point numpy
这是一种特殊的有损压缩,很容易在numpy中实现.
我原则上可以直接比较原始(float64)和重建(float64(float32(原始))并知道最大错误之类的事情.
除了查看我的实际数据的最大误差之外,是否有人知道这会产生什么类型的失真,例如作为原始值的大小的函数?
我会更好地将所有值(以64位为单位)映射到首先说[-1,1](作为极值的一小部分,可以保留在64位中)以利用更接近零的浮点密度?
我正在添加一个我想到的具体案例.假设我有500k到1e6的值,范围从-20到20,大约是IID~Normal(mu = 0,sigma = 4),所以它们已经非常集中在零附近,而"20"是〜5-sigma罕见.让我们说它们是科学测量,其中真正的精度比64位浮点数少很多,但很难确切地知道.我有大量单独的实例(可能是TB的价值),因此压缩具有很多实用价值,而float32是获得50%的快速方法(如果有的话,通过gzip等额外的无损压缩更好地工作).所以"-20到20"消除了很多关于真正大值的担忧.
以下假设您使用标准IEEE-754浮点运算,这些运算在通常的舍入到最近模式下是常见的(有一些例外).
如果double值在float值的正常范围内,那么当double被舍入到float时发生的唯一变化是有效位数(值的小数部分)从53位舍入到24位.这将导致最多1/2 ULP(精度最低的单位)的误差.浮子的ULP是两个不大于浮子的最大功率的2 -23倍.例如,如果浮点数为7.25,则2的最大幂不大于4,因此其ULP为4*2 -23 = 2 -21,约为4.77e-7.因此,当间隔[4,8]中的双精度转换为浮点时的误差最多为2 -22,约为2.38e-7.再举一个例子,如果一个浮点数约为0.03,那么两个不大于2的最大幂是2 -6,所以ULP是2 -29,转换为double时的最大误差是2 -30.
那是绝对的错误.相对误差小于2 -24,即1/2 ULP除以该值可能的最小值(特定ULP的间隔中的最小值,因此限制它的2的幂).例如,对于[4,8]中的每个数字x,我们知道该数字至少为4且误差最多为2 -22,因此相对误差最多为2 -22/4 = 2 -24.(错误不能正好是2到24,因为将精确的2 的幂从float转换为double时没有错误,所以只有当x大于4时才会出错,所以相对误差小于,不等于,2 -24.)当你对被转换的值有更多了解时,例如,它接近8比4,你可以更严格地约束错误.
如果数字超出浮点数的正常范围,则错误可能会更大.最大有限浮点值为2 128 -2 104,约为3.40e38.当你将1/2 ULP(浮点数;双精度具有更精细的ULP)的双精度值转换为浮点数或更大值时,返回无穷大,当然,这是一个无限的绝对误差和无限的相对误差.(一个大于最大有限浮点数但大于小于1/2 ULP的双精度转换为最大有限浮点数并具有前一段中讨论的相同误差.)
正常正常浮动的最小值为2 -126,约为1.18e-38.将此(包括)的1/2 ULP内的数字转换为它,但小于该数字的数字将转换为特殊的非规范化格式,其中ULP固定为2 -149.绝对误差最多为1/2 ULP,2 -150.相对误差将在很大程度上取决于转换的值.
以上讨论了正数.负数的误差是对称的.
如果double的值可以完全表示为float,则转换中没有错误.
将输入数字映射到新间隔可以减少特定情况下的错误.作为一个人为的例子,假设所有的数字是在区间[2整数48,2 48 2 24).然后将它们转换为float将丢失区分值的所有信息; 他们都将被转换为2 48.但将它们映射到[0,2 24 ]将保留所有信息; 每个不同的输入将转换为不同的结果.
哪种地图最适合您的目的取决于您的具体情况.
简单的变换不太可能显着减少错误,因为您的分布以零为中心。
缩放可以在只有两种方式作用:一是,它移动值远离单精度值的反规范间隔,(-2 -126,2 -126)。(例如,如果你乘以,比方说,2点123的值即是在[2 -249,2 -126)被映射到[2 -126,2 -3),其是反规范区间之外。)两个,它改变值位于每个“ binade”中(从一个2的幂到另一个的幂的间隔)。例如,你的最大值为20,其中,所述相对误差可以是1/2 ULP / 20,其中,ULP对于binade是16 * 2 -23 = 2 -19,所以相对误差可以是1/2 * 2 - 19/ 20,大约4.77e-8。假设缩放比例为32/20,则小于20的值变为小于32的值。然后,当转换为float时,相对误差最大为1/2 * 2 -19 / 32(或小于32),大约是2.98e-8。因此,您可以稍微减少错误。
对于前者,如果你的价值观几乎正态分布,很少在(-2 -126,2 -126),仅仅是因为该区间是如此之小。(您的正态分布的数万亿个样本几乎肯定在该时间间隔内没有值。)您说的是科学测量,因此也许它们是用某种仪器制成的。可能是机器未进行足够精确的测量或计算而无法返回2 -126到20 范围内的值,因此,如果您在非正常间隔中根本没有任何值,这也不会令我感到惊讶。如果在单精度非正规范围内没有值,那么进行缩放以避免该范围是没有用的。
关于后者,我们看到在您的产品范围的末尾可以有一些小的改进。但是,在您范围内的其他位置,有些值也移到了binade的高端,但是有些值越过binade边界移到了新binade的小端,这导致它们的相对误差增加。不可能有明显的净改善。
另一方面,我们不知道对您的应用程序有什么重要意义。您的应用程序可以容忍多少错误?如果每个数字加上1%的随机噪声,最终结果的变化是否会不明显?还是如果几个数字变化少至2 -200,结果将是完全不能接受的?
您对产生这些数字的机器了解多少?它真的产生比单精度浮点数更精确的数字吗?也许,尽管它产生64位浮点值,但实际值限于以32位浮点表示的总体。您是否执行了从double到float的转换并测量了误差?
仍然没有足够的信息来排除这些或其他可能性,但是我最好的猜测是,任何转换都无济于事。转换为float会引入太多错误,也不会引入太多错误,并且先转换数字不太可能改变这一点。
归档时间: |
|
查看次数: |
795 次 |
最近记录: |