循环和内置函数之间的数值不一致

2023-12-05

我正在尝试计算随机数数组的总和。但是,当我一次执行一个元素与使用内置函数时,结果之间似乎不一致。此外,当我降低数据精度时,误差似乎会增加。

import torch
columns = 43*22
rows    = 44
torch.manual_seed(0)
array = torch.rand([rows,columns], dtype = torch.float64)
array_sum = 0
for i in range(rows):
    for j in range(columns):
        array_sum += array[i, j]

torch.abs(array_sum - array.sum())

结果是:

tensor(3.6380e-10, dtype=torch.float64)

using dtype = torch.float32结果是:

tensor(0.1426)

using dtype = torch.float16结果(哇!):

tensor(18784., dtype=torch.float16)

我很难相信没有人问过这个问题。然而,我还没有在SO中找到类似的问题。

任何人都可以帮我找到一些解释或这个错误的根源吗?


第一个错误是这样的: 你应该将求和行更改为

array_sum += float(array[i, j])

对于 float64 来说这不会造成问题,对于其他值来说这是一个问题,解释如下。

首先:在进行浮点运算时,您应该始终记住,由于舍入误差而存在小错误。最简单的查看方法是在 python shell 中:

>>> .1+.1+.1-.3
5.551115123125783e-17

但你如何考虑这些错误呢? 当将 n 个正整数相加为总和时,分析相当简单,规则是:

错误(tot)

其中因子 n 通常是总体高估,而机器 epsilon 取决于浮点数的类型(表示大小)。 并且大约是:

float64: 2*10^-16
float32: 1*10^-7
float16: 1*10^-3

人们通常认为误差大约在 tot*machine_epsilon 的合理因子内。

对于我对 float16 的测试,我们得到(总是 +-40000 个变量,总和为 +- 20000):

error(float64) = 3*10^-10 ≈ 80* 20000 * 2*10^-16
error(float32) = 1*10^-1  ≈ 50* 20000 * 1*10^-7

这是可以接受的。

然后浮点数 16 还有另一个问题。有机器 epsilon = 1e-4,你可以看到问题

>>> ar = torch.ones([1], dtype=float16)
>>> ar
tensor([2048.], dtype=torch.float16)
>>> ar[0] += .5
>>> ar
tensor([2048.], dtype=torch.float16)

这里的问题是,当达到值 2048 时,该值不够精确,无法添加 1 或更少的值。更具体地说:使用 float16,您可以“表示”值 2048,也可以表示值 2050,但不能表示介于两者之间的值,因为对于该精度来说,它的位数太少。通过将总和保存在 float64 变量中,您可以解决这个问题。解决这个问题我们得到了 float16:

error(float16) = 16  ≈ 8* 20000 * 1*10^-4

虽然很大,但作为相对于 float16 表示的 20000 的值是可以接受的。

如果您问自己,这两种方法中哪一种是“正确的”,那么答案不是这两种方法,它们都是具有相同精度的近似值,但误差不同。 但正如您可能猜到的那样,使用 sum() 方法更快、更好、更可靠。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环和内置函数之间的数值不一致 的相关文章

随机推荐

  • 为画布上的矩形设置 zindex 不会将其置于前面

    我对画布和在其上绘制的矩形有疑问 他们以相反的创建顺序获得事件 最新的在顶部 而不是 zindex 的顺序 我已将 ItemsControl 与资源列表绑定 然后有一个画布作为项目面板
  • 是否有微数据标签来指定值是数字、字符串还是布尔值?

    有一个 HTML5 属性称为datetime指示值类型是日期时间 但我看不出有什么办法可以表明是否itemprop值在spantag 是字符串 布尔值或数字 我认为没有办法将此类信息包含在微观数据中 对吗 如果是这样 是否有某种原因应省略此
  • PHP解码json

    这里有人可以帮我用 php 解码 json 吗 我正在尝试解码 json api url 这是我现在所拥有的 string username someusername unconfirmed reward 0 08681793 send t
  • 通过 api/cli 启用和禁用 S3 复制规则

    我已在 S3 存储桶上设置了复制规则 以填充 preprod 存储桶以进行测试 这意味着我希望能够轻松地打开和关闭复制 并可能根据需要转储和刷新复制存储桶 我正在为此创建一个脚本 但很难找到一种在使用 AWS 控制台之外轻松打开和关闭复制规
  • TripleDES 加密和解密给出奇怪的结果

    我有一个有效的实施TripleDESCng 针对一些测试向量进行测试 但会发生以下情况 当我加密纯文本时This is a sample message 24 字节 因此这将是 3 个块 十六进制为546869732069732061207
  • DynamicJasper - 如何添加子报表作为列?

    Overview 我有一个 Java 类 其中有一个ArrayList必须打印到 jasperReport 作为子报表 我正在使用 DynamicJasper 库 关于这个问题的示例已被修改 因此可以复制 然而 实际情况的数据有所不同 Pr
  • 将单列分成 3 列,保留原始列 (R)

    我有一个独特的字符列 位于 DD HH MM 中 我试图将该列分成 3 个新的numeric列 我对单独函数的问题是它替换了原始列 并且我不知道如何传递多个条件SEP 请注意 并非每个观察结果都有 DD 我当前的代码如下所示 separat
  • IPC 性能:命名管道与套接字

    每个人似乎都说命名管道比套接字 IPC 更快 他们快了多少 我更喜欢使用套接字 因为它们可以进行双向通信并且非常灵活 但如果速度相当大 我会选择速度而不是灵活性 您将获得的最佳结果共享内存解决方案 命名管道仅比 16 好TCP 套接字 结果
  • C# 与 C++/CLI 中的 Unicode 字符串文字

    C char z u201D int i int z C CLI wchar t z u201D int i int z In C i正如我所期望的那样 变成了 8221 201D 另一方面 在 C CLI 中 它变成了 65428 FF9
  • Java 获取 MIB 中 OID 的名称/描述

    我正在编写一个网络管理系统 并且需要能够打印出从 SNMP 陷阱接收到的 OID 后面有意义的名称 由于该系统的性质 大小 对于正在使用的每台设备上的每个 MIB 手动将每个 OID 映射到有意义的名称并不是一个好主意 话虽如此 是否有一种
  • 更快的 iPhone PNG 动画

    目前 我的计时器上有一个 PNG 动画 每 0 01 秒触发一次 然而 性能并不是最佳的 而且动画速度明显很慢 我有超过 2000 张图片 有更好的方法来实现这一点吗 我在下面发布了与我的方法类似的内容 timer NSTimer sche
  • R 中向量的指数移动平均值

    我有一个简单的向量如下 x c 14 24 13 82 12 75 12 92 12 94 13 00 14 14 16 28 20 64 17 64 我正在尝试使用以下函数找到该向量的滚动 EMA library TTR y EMA x
  • matplotlib 错误 - 没有名为 tkinter 的模块 [重复]

    这个问题在这里已经有答案了 我尝试在 Windows 10 上通过 Pycharm IDE 使用 matplotlib 包 当我运行这段代码时 from matplotlib import pyplot 我收到以下错误 ImportErro
  • Java Swing、JComboBox 下拉列表在单击之前更改侦听器

    我有一个 JComboBox 其中包含 MIDI 文件列表 我想知道以下操作是否可行 当我单击 JComboBox 时 会打开一个下拉列表 当我将鼠标移到 midi 文件上时 它会播放 10 秒的示例声音 因此我知道该文件包含什么内容在我单
  • CakePHP 不使用我的模型

    我有这两个 CakePHP V 2 4 5 模型 class Owner extends AppModel public name Owner public hasMany array Car and class Car extends A
  • 使用python将csv转为json,json按行排列

    我想使用 Python 将 CSV 转换为一组 JSON 对象 并按行格式化 我尝试了下面的脚本 将几个 SO 答案放在一起 但格式如下 key value key value etc 我想将其格式化为 key value key valu
  • 更改 Microsoft Azure Blob - PHP 的默认服务版本

    this gt blobClient ServicesBuilder getInstance gt createBlobService azureString properties this gt blobClient gt getServ
  • Web Speech API Grammar 是否向开发人员公开?

    我目前正在对 Webkit 语音识别进行一些研究 我想创建一个特定于应用程序的语法文件 根据W3C的定义我写了下面的代码 但它似乎并没有显示出对这些单词的识别效果有所改善 您能提供一些帮助吗 var 识别 new webkitSpeechR
  • 当数组中元素的长度大于 2 时,出现“太多值无法解压(预期为 2)”

    也许问这个问题会很奇怪 因为我当然不明白 例如 如果我们有a 1 2 3 4 操作有效 for x y in a print x y 但是一旦我们向这些元组添加任何其他元素 a 1 2 3 4 5 6 for x y in a print
  • 循环和内置函数之间的数值不一致

    我正在尝试计算随机数数组的总和 但是 当我一次执行一个元素与使用内置函数时 结果之间似乎不一致 此外 当我降低数据精度时 误差似乎会增加 import torch columns 43 22 rows 44 torch manual see