函数返回后,C返回不正确的浮点值

时间:2019-10-17 23:34:26

标签: c

首先,我不认为这与精度有关,我认为变量会以某种方式失去作用域?

下面的功能,头文件排序。h:

#ifndef SORTING_H
#define SORTING_H

/*===========================================================================
Function        find_median
Description:    median values in a  sorted array.
==========================================================*/
float find_median(float values[],int n );

#endif /* SORTING_H */

实施文件sorting.c:

#include  "sorting.h"

float find_median(float values[],int n)
{ 
    float val = 0.0f; 
    // check for even case 
    if (n % 2 == 0) 
    {
     val = (float)values[n/2]; 
    }
    else
    {
        int low_index = (n)/2; 
        int high_index=  low_index + 1; 
        val = (values[low_index] + values[high_index])/2.0f;
    }

    return val; 

} 

主要条目main.c:

int main(int argc, char** argv)
{
    //unsorted
    float output_array[] = { 3, 17, 13, 6, 9, -1, 10, 10 };

    int row_length = sizeof(output_array) / sizeof(output_array[0]);

    //sort
    quicksort_iterative(output_array, row_length);

    float median = 0.0f;
    //get the median
    median =  find_median(output_array, row_length);

    printf("median=%f", median);
}

输出:

已排序:,-1.000000,3.000000,6.000000,9.000000,10.000000,10.000000,13.000000,17.000000 中位数= 6422100.000000

我试图将最终的中值从中分配为返回值,也尝试将中值作为参数传递,但是两次尝试都返回不正确的值。

中位数应为11。

4 个答案:

答案 0 :(得分:2)

您似乎想在调用函数中修改median。在C ++中,您只需要做的是:

float median(float values[],int n, float& median)

C有点难。为此,您需要一个指针:

float median(float values[],int n, float *median)
{
    // ...
    *median = val;
    // ...
}
// ...
find_median(output_array, row_length, &median);

答案 1 :(得分:0)

该函数在标头中称为find_median,但在实现中称为median ...如何链接?

然后,您没有将find_median的结果分配给变量median

答案 2 :(得分:0)

我认为您的公式有问题。试试这个。

float median(float values[],int n) //, float& median)  //note: notice the & here.
{ 
    float val = 0.0f; 
    // check for even case 
    if (n % 2 == 0) 
    {
        //get the average of the 2 mid values.
        int high_index = n/2;
        int low_index = high_index - 1;
        val = (values[high_index] + values[low_index])/2.0f;  
        //note: 2 is integer, 2.0f is float. there might be problem if you use 2 speciall in division.

        printf("even case: val=%f\n", val);
        printf("values[%d]=%f\n",low_index);
        printf("values[%d]=%f\n",high_index);

    }
    else
    {

        val = values[n/2]; 
        printf("odd case: val=%f\n", val);

    }
    //median = val;   //2 way output?
    return val; 

} 

更新 我在代码上添加了日志,以跟踪问题的原因。

答案 3 :(得分:0)

您在许多基本方面都感到困惑。首先,请查看您的函数find_median,尤其是参数:(假定您实际上是要为函数float_median命名,而不仅仅是用median编写的sorting.c

 float float_median(float values[],int n, float median);

您的函数将float数组作为第一个参数,这很好。 (但可以简单地写为float *values,因为数组在访问时会转换为指针,请参见:C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) -它对C ++的作用相同)

现在,您的第二个参数int n传递了数组中元素的数量(也可以),但是您的第三个参数float medianfloat_median中实际上未被使用。分配median = val;的效果为零,因为在C参数中通过值传递,因此float_median的{​​{1}}中的赋值仅更改副本的值 <函数中使用的{/ {1}}中的/ strong>,并且对median = val;中原始的median具有零影响。您要从函数中返回中值,因此只需删除第三个参数,例如

median

注意:分母也从main()更改为#include <math.h> #include "sorting.h" float find_median (float *values, int n) { float val = 0; // check for even case if (n % 2 == 0) val = (float)values[n/2]; else { int low_index = floor(n-1)/2; int high_index = ceil(n-1)/2; val = (values[low_index] + values[high_index]) / 2.; } return val; } ,以消除生成的强制转换以避免整数除法)

做好使用标题保护程序的工作,以防止多次包含2。您只需要更新函数原型即可删除第三个参数,例如

2.0

在您的sorting.h(我称为#ifndef SORTING_H #define SORTING_H /*=========================================================================== Function find_median Description: median values in a sorted array. ==========================================================*/ float find_median (float values[], int n); #endif /* SORTING_H */ )中,您尝试使用您未提供的main()函数。忘记了,只需为sort.c中的元素编写一个快速比较函数,然后使用标准的quicksort_iterative函数对数组进行排序即可,例如

output_array

现在只需编译:

qsort

注意:我还建议添加#include <stdio.h> #include <stdlib.h> #include "sorting.h" int compare (const void *a, const void *b) { return (*(int*)a > *(int*)b) - (*(int*)a < *(int*)b); } int main (void) { float output_array[] = { 3, 17, 13, 6, 9, -1, 10, 10 }; int row_length = sizeof output_array / sizeof *output_array; //sort qsort (output_array, row_length, sizeof *output_array, compare); float median = find_median (output_array, row_length); for (int i = 0; i < row_length; i++) printf (i ? " %g" : "%g", output_array[i]); putchar ('\n'); printf ("\nmedian = %.2f\n", median); } 来捕获任何阴影变量)

使用/输出示例

gcc -Wall -Wextra -pedantic -std=c11 -Ofast sorting.c -o bin/sort sort.c

仔细检查一下,如果还有其他问题,请告诉我。如果您在Windows上或使用gcc / clang以外的其他编译器,请告诉我,我可以为您发布等效的编译选项。