ysh329 / OpenCL-101

Learn OpenCL step by step.
123 stars 31 forks source link

Floating Number #67

Open ysh329 opened 2 weeks ago

ysh329 commented 2 weeks ago

  1. https://docs.python.org/3/tutorial/floatingpoint.html#representation-error
  2. https://blogs.mathworks.com/cleve/2017/05/08/half-precision-16-bit-floating-point-arithmetic
  3. https://ww2.mathworks.cn/search.html?c%5B%5D=entire_site&q=float&fq%5B%5D=subcollection:community/blogs&page=1
ysh329 commented 2 weeks ago

Random

https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy

ysh329 commented 2 weeks ago
# clip不是必须的,超了就超了,+inf或-inf
a=np.random.normal(0, 800, 100000).clip(high, low).astype("float16")

# 有小数位(不为0)的概率
(np.abs(a-a.astype("int64")) > 0).tolist().count(True) / a.size

# 在区间[-1000, 1000]的概率
((-1000<a) & (a<1000)).tolist().count(True) / a.size

image

image 深蓝色区域是距平均值小于一个标准差之内的数值范围。在正态分布中,此范围所占比率为全部数值之68%,根据正态分布,两个标准差之内的比率合起来为95%;三个标准差之内的比率合起来为99%。

ysh329 commented 2 weeks ago

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.truncnorm.html https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy

# https://stackoverflow.com/questions/36894191/how-to-get-a-normal-distribution-within-a-range-in-numpy

from scipy.stats import truncnorm

def get_truncated_normal(mean=0, sd=1, low=0, upp=10):
    return truncnorm(
        (low - mean) / sd, (upp - mean) / sd, loc=mean, scale=sd)
ysh329 commented 2 weeks ago

image

ysh329 commented 2 weeks ago

指令行为

NumPy 的 sum 在计算浮点数求和时候,会避免求和的计算方式是挨个累加到最终的结果上的,因为这每一次的累加过程,都会导致 rounding 误差,最终就放大了。 NumPy 是使用一种数值更好的方式,即 partial pairwise summation,这种方式可以在很多使用场景上提高精度。

Partial pairwise summation(部分成对求和)

Partial pairwise summation(部分成对求和)是一种数值分析中的技术,它用于提高数值积分或级数求和的精度。这种方法通常在数值计算中用于减少累积误差,特别是在计算长序列的和时。

在传统的求和方法中,例如直接求和或者使用Kahan求和算法,随着求和项数的增加,累积的舍入误差可能会变得显著。这是因为每次加法运算都可能引入一些舍入误差,而这些误差会随着求和项数的增加而累积。

计算过程

Partial pairwise summation(部分成对求和)的计算过程:

  1. 配对求和:将求和项分成对,并对每对进行求和。例如,如果有四个项 𝑎 , 𝑏 , 𝑐 , 𝑑。那么首先计算 𝑎 + 𝑏 和 𝑐 + 𝑑
  2. 再求和:将上述得到的和再次配对求和。在上例中,就是计算 ( 𝑎 + 𝑏 ) + ( 𝑐 + 𝑑 )。

高精度的原因

  1. 浮点数加法的非结合性

    • 浮点数加法是非结合性的,这意味着加法的顺序会影响最终的结果。具体来说, (a + b) + c 不一定等于 a + (b + c),因为在计算机中,每次浮点数加法操作都可能引入舍入误差。
  2. 减少误差传播

    • 在普通的逐元素加法中,数值较大的浮点数和数值较小的浮点数混合在一起时,加法操作可能会导致较小数值的舍入误差被放大。例如,在将一个非常大的数与一个非常小的数相加时,小数可能会因为舍入误差而完全消失。
    • 成对求和通过将数组分割成较小的部分并分别求和,确保每次加法操作的数值差异相对较小,从而减少了舍入误差的传播。
  3. 分治法的优势

    • 成对求和本质上是一种分治法,将问题分成多个子问题并逐步解决。通过这种方法,可以更好地控制每个子问题的数值误差,避免将所有误差集中到一次计算中。
    • 在计算每一对数值的和时,误差相对较小,逐步累积时总误差相对减少。
  4. 提高数值稳定性

    • 通过分组求和,成对求和算法使得每次加法操作的数值差异较小。这种方法可以更好地保持数值的稳定性,尤其是在数值范围差异较大的情况下
ysh329 commented 1 week ago

浮点数的表达力

image

image