结果不一致 (C)?

2023-12-25

在此程序中,我编写了多个公式,对于一个公式,我得到了不一致的结果,尽管每次运行的代码和输入都是相同的。有问题的函数是“WqFormula”。在某些运行中,我得到正确的结果,即 0.041667,而在其他运行中,我得到 0.000000。我正在使用 GCC 4.6.3 在 Ubuntu(64 位)上进行编译。另一件事是我尝试使用 GCC 4.4.6 在电脑上编译并运行它,它为每个公式提供了完全不同的结果。代码如下:

float PoFormula(float, float, int);
float LFormula(float, float, int);
float WFormula(float, float, int);
float LqFormula(float, float, int);
float WqFormula(float, float, int);


int main() 
{
    int n, m; //# of arrivals, # of service channels
    float mu, lambda; //avg serviced, arrivals in time period
    printf("lambda (l) = ");
    scanf ("%f", &lambda);
    printf("mu (m) = ");
    scanf ("%f", &mu);
    printf("m (M) = ");
    scanf("%i", &m);
    float test, test2, test3, test4, test5;
    test = PoFormula(lambda, mu, m);
    printf("PoFormula is %f\n", test);
    test2 = LFormula(lambda, mu, m);
    printf("LFormula is %f\n", test2);
    test3 = WFormula(lambda, mu, m);
    printf("WFormula is %f\n", test3);
    test4 = LqFormula(lambda, mu, m);
    printf("LqFormula is %f\n", test4);
    test5 = WqFormula(lambda, mu, m);
    printf("WqFormula is %f\n", test5);
    return;
}

float PoFormula(float lambda, float mu, int m)
{
    float summation, factorial = 1;
    int i, j;
    for (i=0; i < (m); i++)
    {
        for (j=1; j < (i+1); j++) factorial *= j;
        factorial = 1 / factorial;
        factorial = factorial * pow ((lambda/mu), i);
        summation += factorial;
    }
    factorial = 1;
    for (j=1; j < (m+1); j++) factorial *= j;
    factorial = 1 / factorial;
    factorial = factorial * pow ((lambda/mu), m);
    factorial = factorial * ((m*mu)/((m*mu) - lambda));
    factorial += summation;
    factorial = 1 / factorial;
    return factorial;
}

float LFormula(float lambda, float mu, int m)
{
    float factorial = 1, po;
    int j;
    po = PoFormula(lambda, mu, m);
    for (j=1; j < (m); j++) factorial *= j;
    factorial *= pow(((m*mu) - lambda), 2);
    factorial = (((lambda*mu)*(pow((lambda/mu),m)))/factorial) * po;
    factorial += (lambda/mu);
    return factorial;
}

float WFormula(float lambda, float mu, int m)
{
    float factorial = LFormula(lambda, mu, m);
    factorial /= lambda;
    return factorial;
}

float LqFormula(float lambda, float mu, int m)
{
    float factorial = LFormula(lambda, mu, m);
    factorial -= (lambda/mu);
    return factorial;
}

float WqFormula(float lambda, float mu, int m)
{
    float factorial = LqFormula(lambda, mu, m);
    factorial /= lambda;
    return factorial;
}

每次应该打印的是这样的:

PoFormula 为 0.500000

L公式为0.750000

W公式为0.375000

Lq公式为0.083333

Wq公式为0.041667

如果需要,我很乐意提供更多信息。


下面的函数使用summation没有初始化它:

float PoFormula(float lambda, float mu, int m)
{
  float summation, factorial = 1;
  for (i=0; i < (m); i++)
  {
    // ....
    summation += factorial;
  }

因此,您不能期望该函数的任何结果都有意义。

如果您要求的话,您的编译器可以警告您此类问题(您确实应该这样做!):

对于 GCC,编译为-Wall -Wextra http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(我个人也用-pedantic,YMMV)以获得尽可能多的警告。然而,在这种特殊情况下,GCC 似乎对这个问题视而不见,直到您启用优化 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html using -O.

您现在可以停止阅读并简单地使用-Wall -Wextra -O编译时发现这个问题。


GCC的未初始化变量分析有两种不同的检查——”确实使用未初始化的“和”possibly使用未初始化”。根据是否启用优化,分析的工作方式有所不同:

  • 如果优化关闭(-O0,默认),编译器在单个分析过程中执行这两项检查。
  • 如果启用优化,编译器会执行两遍 - 第一遍仅执行“绝对未初始化”检查,第二遍在优化后发生(因为优化可能会更改控制流)并执行两项检查。

我对 GCC 内部结构不够熟悉,无法了解代码中隐藏此问题的原因,但我将其简化为这个测试用例 https://gist.github.com/3769253,如果有人想深入挖掘的话。如果展开循环,即使没有-O,因此循环展开优化可能与此有关。


如果您使用 MSVC,请使用/W4 http://msdn.microsoft.com/en-us/library/thxezb7y.aspx以获得最多的警告。无论是否进行优化,MSVC 都会在默认警告级别将此未初始化的变量报告为问题。

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

结果不一致 (C)? 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • VB6 中的集中错误处理

    我有所有错误处理程序调用的以下方法 Public Function ToError strClass As String strMethod As String As String On Error GoTo errHandle ToErr
  • 如何在JavaFX中使用PauseTransition方法?

    我读了这本书 但我仍然对暂停过渡方法感到困惑 我制作了一个显示数字的标签 我希望该数字每秒都在增加 如何使用 PauseTransition A 暂停转换 http docs oracle com javase 8 javafx api j
  • 类“类型”和“对象”之间有什么关系?

    班上type是它自身的一个实例 即type是其自身的元类 我们如何定义一个类 哪个是它自身的一个实例 gt gt gt type type
  • 为什么 PHP 将 $_COOKIE 中的加号替换为空格?

    所以根据我对 PHP 和 cookie 的理解 如果我使用setcookie 函数 然后我得到一个自动 url 编码的 cookie 当我去 COOKIE数组 我应该取回 cookie 自动 url 解码 问题是 当我查看时 它似乎对 co
  • 如何使用 xgboost 模型对数据框中的单行进行预测

    我正在装修一个xgboost模型到存储在数据框中的某些数据 拟合后 我想在数据帧的单行上运行分类器 回归器的 predict 方法 下面是一个最小的示例 它在整个数据帧上预测良好 但仅在数据帧的第二行上运行时崩溃 from sklearn
  • Go:使用多种类型解组 JSON

    我在将 JSON 响应解组到结构中时遇到问题 我遇到的问题是邮政编码可以作为字符串或整数返回 如何编写一个解组方法来检查 zip 是否为 int 并强制将其存储为字符串 Struct type CustomerAddress struct
  • 是否有类似于 file:///android_asset/ 的路径指向 apps 目录?

    我正在使用 WebView 打开保存到应用程序的一些文件 有没有一种方法可以链接到运行时保存文件的应用程序目录 就像 file android asset 那样 通过链接我的意思是loadUrl path 以及正在打开的文件的 HTML 标
  • 为什么 puppeteer page.goto() 挂起?

    我在跑puppeteer in an alpine chrome带沙箱的容器 一切都完全按照文档的建议完成 我创建了一大堆不同的木偶驱动服务器 我将在没有任何参数的情况下启动 Puppeteer 除了headless false Why i
  • nx 构建命令因 TypeError 失败:无法读取未定义的属性(读取“云”)

    我正在尝试跑步nx build它工作正常 但现在停止工作了 下面是日志 vercel path0 node modules nrwl nx cloud lib nx cloud tasks runner js 20 const noClou
  • Angular7 Mat-select截距变化

    在我的用例场景中 我有一个下拉框 mat select 它填充了几个输入字段 任何更改都会以不同的方式填充字段 由于用户可以更改字段 因此我想在执行最终更改之前询问用户是否同意清除 或更改 所有字段 如果选择 否 则不会发生选择更改 并且所
  • 查找相邻多边形 - postgis 查询

    问题 我有一张充满多边形 一个国家的地区 的桌子 其中一些多边形具有可能会或可能不会被检查的特定属性 在这种情况下 该属性称为 spread checked 值为 1 现在我想运行一个查询来查找所有 检查 的多边形 就像是 SELECT F
  • Visual Basic .net 中图像的透明度?

    我的表单上有一个图片框 我向其中添加了图片 这张图片有一个透明的背景 但不幸的是 它似乎在图片框中丢失了 我猜测这是因为图片框的背景颜色属性设置为灰色 默认 但我看不到任何 透明 选项 知道我该怎么做吗 根据您想要实现的目标 有几种不同的方
  • 在python中创建一个可变长度的字符串

    我需要创建一个由空格组成的字符串 并且需要在运行时确定字符串的长度 这就是我正在做的事情 suffix join for x in range 0 max 必须有一个better方式 更clever方式 以及一个easier方式 有哪些方法
  • 我如何允许 django-merchant 接收 paypal IPN 确认?

    我发现了很多类似的问题 但似乎我仍然无法使我的设置工作 我正在尝试使用 django merchant 在我的网站上接受简单的 IPN paypal 付款 如果我理解正确的话 一旦设置正确 django merchant 应该为 PayPa
  • 操作后压缩 PDF

    我有以下问题 我从 Kyocera 扫描仪设备接收各种扫描的 PDF 文件 我必须自动操作这些 PDF 文件以便 删除文本标记中的颜色 将 PDF 转换为灰度 将其放入我们的 DMS 中 我正在使用 Bash 脚本来完成这项工作 为了删除文
  • Graphql 帖子正文“必须提供查询字符串。”

    我使用 Express graphql 中间件 我在正文行中发送以下请求 POST graphql HTTP 1 1 Host local 8083 Content Type application graphql Cache Contro
  • 在 Windows 中 grep unicode 文本文件的免费程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 unicode 文本文件集合 从 regedit 导出 我想提取带有特定文本的所有行 我试过
  • 用户 root @ localhost 的访问被拒绝 [重复]

    这个问题在这里已经有答案了 我正在尝试连接到 mysql 但它给出了警告 mysqli connect HY000 1045 用户 root localhost 访问被拒绝 使用密码 YES 我认为用户名和密码是正确的 因为我可以在 kom
  • 为什么 `useCallback` 不能总是返回相同的引用

    我不明白为什么useCallback每次更新其中一个 deps 时 总是返回一个新的引用 它导致许多重新渲染React memo 本来可以避免的 此实施有 什么问题 如果有 useCallback export function useCa
  • 结果不一致 (C)?

    在此程序中 我编写了多个公式 对于一个公式 我得到了不一致的结果 尽管每次运行的代码和输入都是相同的 有问题的函数是 WqFormula 在某些运行中 我得到正确的结果 即 0 041667 而在其他运行中 我得到 0 000000 我正在