计算平均值时如何避免潜在的溢出?

2023-11-30

我正在编写一个函数来获取调用特定的时钟的平均值void (*)(void) aka void -> void运行特定次数。

我担心如果样本量太大,观察值的总和会溢出并使平均值无效。

是否有一种标准方法可以消除此类问题中总和溢出的可能性?

注意:我知道这个例子太天真,无法得出有关性能的任何结论;我感兴趣的是消除总和溢出的可能性,而不是得出任何性能方面的结论。

注2:我也理解64位无符号数实际上不会溢出,除非程序运行数百年,但我很好奇是否也可以消除这个假设。

这是我的独立代码:

#include <Windows.h>
#include <stdio.h>

/**
 * i want to parametrize the type which is used to store sample size
 * to see whether it impacts performance 
 */
template <typename sampleunit_t>
static inline ULONGLONG AveragePerformanceClocks (void (*f)(),  sampleunit_t nSamples)
{
    ULONGLONG sum;
    sampleunit_t i;    

    sum = 0;

    for (i = 0; i < nSamples; ++i) {
        LARGE_INTEGER t1; 
        LARGE_INTEGER t2;
        ULONGLONG dt;

        QueryPerformanceCounter(&t1);
        f();        
        QueryPerformanceCounter(&t2);

        dt = t2.QuadPart - t1.QuadPart;

        // sum may possibly overflow if program runs long enough with
        // a large enough nSamples
        sum += dt;
    }


    return (ULONGLONG)(sum / nSamples);
}

/* a cdecl callback that consumes time */
static void test1() 
{
    // don't optimize
    volatile int i;

    for (i = 0; i < 10000; ++i) {

    }
}

int main(int argc, char **argv)
{
    ULONGLONG avg;

    avg = AveragePerformanceClocks<BYTE>(test1, 255);    
    printf("average clocks(truncated): %llu.\n", avg);   

    avg = AveragePerformanceClocks<WORD>(test1, 255);    
    printf("average clocks(truncated): %llu.\n", avg);   

    avg = AveragePerformanceClocks<DWORD>(test1, 255);    
    printf("average clocks(truncated): %llu.\n", avg);   

    avg = AveragePerformanceClocks<ULONGLONG>(test1, 255);    
    printf("average clocks(truncated): %llu.\n", avg);   

    system("pause");

    return 0;
}

前 n 个元素的平均值为

          SUM
Average = ---
           n

下一个元素 Mi 是

           (SUM + Mi)
Average2 = ----------
              n + 1

因此,给定当前平均值,可以使用新读数找到下一个平均值。

           (Average * n + Mi )
Average2 = -------------------
                  n + 1

然后可以将其更改为不增加的方程

                       n      Mi
Average2 = Average * ----- + -----
                     n + 1   n + 1

在计时实践中,时间的大小将适合计算机的数据类型。

正如所指出的,这需要使用浮点表示,虽然不会因溢出而失败,但在以下情况下仍然可能失败n/(n+1)小于浮点小数部分的精度。

Update

From 增量平均

有更好的重组。

                       Mi - Average
Average2 = Average  +  -------------
                           n + 1

这是更好的,因为它只有一个部门。

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

计算平均值时如何避免潜在的溢出? 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • 在 IE 中使用 => 时出现语法错误 [重复]

    这个问题在这里已经有答案了 我有以下 JavaScript 代码行 var res Object keys packages filter e gt packages e true 上面的代码在除 IE 之外的所有其他浏览器中都可以正常运行
  • Nifi:如何编写自定义处理器

    我想写nifi处理器 可以从hdfs目录读取xml文件 然后将其数据提取到flowfile属性中 如果有两个 nifi 处理器可以获取该文件并读取数据或向其中写入内容的情况我怎样才能进行文件锁定这样一次只有一个处理器可以使用它 您能给我推荐
  • 在 Angular 2 中使用 ComponentResolver 加载组件时注入不同的提供程序

    我们可以在动态加载组件时注入不同的提供程序吗 我的组件 Component moduleId module id selector my component template div my component div providers M
  • Wikidata+SPARQL:根据股票代码查找公司

    我正在尝试使用 sparql 根据股票代码查找公司 此查询将列出企业及其股票代码 基本查询 SELECT DISTINCT id idLabel ticker WHERE id wdt P31 wdt P279 wd Q4830453 id
  • 如何防止ViewFlipper循环

    我正在开发一个应用程序 其中我使用ViewFlipper与定制OnTouch执行 在里面ViewFlipper 我有大约 20 张图像供用户翻阅 这工作正常 但如果我在该系列中的第 20 个图像处翻转屏幕 它会返回到第一个图像 我想防止Vi
  • AES 姜饼

    This是我的 AES 代码 在 Gingerbread 下 在 2 2 上加密数据然后尝试在 2 3 上解密后出现以下错误 Caused by javax crypto BadPaddingException pad block corr
  • VBA 使用循环引用文本框或标签

    我正在尝试替换以下内容 txt1 Text txt2 Text txt3 Text txt4 text continues for quite awhile With Dim cCont As Control For Each cCont
  • 登录时未通过凭据提供程序加载 KSP(密钥存储提供程序)

    我正在创建一个 Windows 凭据提供程序 以使用此处所述的证书登录到 Windows 域article 这意味着创建一个自定义 KSP 在创建身份验证包时将由 LsaLogonUser 调用 我设法创建自定义 KSP 并在直接调用 Ls
  • JQuery在渲染后搜索dom元素,并用其对应的值替换键

    我正在尝试在我正在开发的网络应用程序上应用我自己的本地化方法 知道我正在使用 JQuery 2 2 0 没有任何其他框架或第三方 我需要在纯 html 代码中编写一些表达式 ex 1 span lang details span ex 2
  • 如何在打字稿中选择性地从一个部分分配到另一个部分

    在下面的 TypeScript 代码片段中 我需要将一个对象分配给另一个对象 其中两个对象都在Partial
  • 当客户向您提供他们的公共证书时进行相互身份验证

    通常 2 路 ssl 又名相互身份验证包括生成服务器 ca 密钥和证书等 然后客户端生成一辆车 将其交给您 您签署他们的 csr 并向他们提供客户端证书 然而 我遇到过一种情况 客户要求我通过交换彼此的 x509 公共证书来实现 相互身份验
  • 使用 Apache POI 创建 .xlsx 文件时出现 java.lang.NoClassDefFoundError

    我正在尝试使用 Apache POI 创建 xlsx 文件 这是我的代码 FileOutputStream outputStream1 null XSSFWorkbook workbook new XSSFWorkbook XSSFShee
  • Cython 预编译器决策[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在寻找一种在 cython 文件中添加预编译器逻辑的解决方案 我已经为 C 中的硬件设备 API 编写了一个 cython 包装器 这是一个 cython 项目 通常使用 MSVC
  • 如何根据点是否在多边形内来标记点

    我有新西兰各地鸟类观测的经度和纬度 存储在Count df 在变量下count longitude and latitude 然而 其中一些出现在近海 海洋中 这是一个公民科学数据集 我想根据这些点是否超出中给出的信息来对它们进行子集化ma
  • 在 WooCommerce 中阻止在没有送货方式的情况下访问结账

    我正在尝试删除继续结帐按钮并限制对结帐页面的访问 直到客户填写购物篮页面上的 计算运费 选项 我创建了一种仅限于多个邮政编码 邮政编码的本地运输方法 然后我将其添加到我的functions php 文件中 function disable
  • EF 的代理键与自然键

    我和我的同事正在尝试确定哪种方法是为两个数据库表设计架构和键的更好方法 一种是很少改变的查找表 它有大约 700 行 另一个表引用查找表 随着时间的推移 该表将有数千行 在设计 B 中 查找表的主键由 3 个 varchar 组成 另一个表
  • 将 VoiceOver 推进到移动 Safari 中的指定元素

    我无法弄清楚如何将 VoiceOver 推进到 Mobile Safari 中的特定元素 到目前为止 我已经尝试过 a href target Skip a a a 如果页面可滚动 但在长页面和短页面上不一致 这将 有时 前进到目标 有时会
  • 解析Excel文件的通用方法

    我需要解析 Excel 文件并从中创建对象列表 为了做同样的事情 我们正在使用有org apache poi为了读取 Excel 文件并且我们能够获取所需的详细信息 目前我们正在根据索引获取单元格值并将其设置到对象字段 但我们认为这不是一个
  • 在Python中按日期范围过滤日志的最佳方法

    打印与日期时间范围匹配的日志行的最佳方法是什么 例如 我只想打印带日期的行 来源 2012 09 30 00 00 10 至 2012 09 30 00 00 13 2012 09 30 00 00 08 773 log error 201
  • 计算平均值时如何避免潜在的溢出?

    我正在编写一个函数来获取调用特定的时钟的平均值void void aka void gt void运行特定次数 我担心如果样本量太大 观察值的总和会溢出并使平均值无效 是否有一种标准方法可以消除此类问题中总和溢出的可能性 注意 我知道这个例