【问题标题】:c double argument being passed as wrong valuec double 参数作为错误值传递
【发布时间】:2014-11-12 04:51:07
【问题描述】:

我遇到了 C 中概率函数的双参数问题。

我有一个以双精度为参数的函数:

int binomrand(double p, int n)
{
    int i;
    int numevents = 0;
    for(i = 0; i < n; i++)
    {
        numevents += bernoullirand(p);
    }
    return numevents;
}

我通过了 .85:

 int numcoach = binomrand(.85,COACH_SEATS);

但是当我进入这个函数的那一刻,Xcode 显示 p 是这样的:

p   double  5.2511106800094658E-315

相差至少 10^314 倍。这甚至发生在调用 bernoullirand 之前,所以我没有在此处包含该代码。

E:

因为它是相关的,这里是 binomrand 的 .h 声明:

int binomrand(float p, int n);

这显然是错误的,但我没想过要去看它。请注意,这是“float”而不是“double”。

当我在其 .c 文件中将函数从 float 更新为 double 时,我忽略了在其 .h 文件中这样做。多个回答者很快意识到了这一点。

【问题讨论】:

  • 你能发布一个简短、完整的程序来演示这一点吗?包括任何必要的函数原型。
  • 你在哪里调用函数,是来自另一个文件吗?在你调用它之前,你需要有一个 binomrand 的函数原型,否则它会尝试传递一个 int 作为你的参数而不是一个 double。
  • 谢谢你,JS1!从浮点数切换到双精度数时忘记更新头文件。
  • 这就是为什么当你写 foo.c 和 foo.h 的时候,foo.c 应该做的第一件事是#include "foo.h"

标签: c type-conversion header-files


【解决方案1】:

如果您在第一次使用之前没有声明函数binomrand 或未正确声明它,就会发生这种情况。在你实际使用它的文件顶部声明函数或使用正确的头文件。

int binomrand(double p, int n);  /* Declaration */

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多