Я новичок в программировании, и недавно я делал домашнее задание в школах. Содержание домашнего задания состоит в вычислении среднего значения набора данных. Ниже мой код. Я обнаружил, что правильное значение — 93,974998, но значение, отображаемое в терминале, — всего 93,000000.
#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include "stats.h"
int findmean(unsigned char *ptr, float count);
int main() {
unsigned char test[SIZE] = {34, 201, 190, 154, 8, 194, 2, 6,
114, 88, 45, 76, 123, 87, 25, 23,
200, 122, 150, 90, 92, 87, 177, 244,
201, 6, 12, 60, 8, 2, 5, 67,
7, 87, 250, 230, 99, 3, 100, 90};
float mean = 0;
float length_data = SIZE;
mean = findmean( &test[0] , length_data);
printf(" mean of the data is %f \n", mean );
return 0;
}
int findmean(unsigned char *ptr, float count){
float total = 0;
for(int i = 0; i < count; i++){
total += *ptr;
ptr++;
}
printf("count is %f\n", count);
return total/count;
}
Если я изменю код, вместо деления общего значения в функции findmean
, а в функции printf
наподобие printf(" mean of the data is %f \n", mean/lenght_data );
, то ответ будет правильным.
Я просто не понял, в чем проблема? Может ли кто-нибудь, где я сделал неправильно?
Кстати, я использую geany, а версия GCC — 9.4.0, если кто-то захочет знать.
Вы возвращаете int
.
Для будущего справочного кода, который мы не можем скомпилировать, это бесполезно (для )_вашей_ причины). Кажется, что SIZE
, вероятно, определено в stat.h
, но в любом случае не требуется. Удалите из объявления test
: unsigned char test[] = ...
, затем int float length_data = sizeof(test)/sizeof(*test) ;
. Хотя проблема явно в том, что findmean()
возвращает int
, ваш подход к типам данных довольно «случайный» и непродуманный. Например, length_data
должно быть целым числом, как и параметр findmean()
count
, учитывая, что вы затем используете его в целочисленном цикле for.
Вернуть тип плавающая точка, а не int
// int findmean(unsigned char *ptr, float count);
...
// int findmean(unsigned char *ptr, float count){
float findmean(unsigned char *ptr, float count);
float findmean(unsigned char *ptr, float count){
float
против double
Лучше всего использовать double
в качестве типа с плавающей запятой по умолчанию в C. Оба имеют ограниченную точность. «Правильное значение ist 93,974998» печатается, когда используется float
, но математически правильный ответ — 93,975. Используйте double
, если нет особой необходимости использовать float
.
Передовой
Ниже показано, как я бы закодировал вычисление иметь в виду.
// Use `double` return type.
// Array length in `size_t` - not too wide, not to narrow type for arrays sizing.
// Length first to allow for diagnostics on ptr[]
// Use `const` to indiacte the refeneced data in `ptr[]` does not change.
double findmean_alt(size_t count, const unsigned char ptr[count]) {
// Accumulate the integer sum of `unsigned chars in a wider integer
unsigned long total = 0;
for (size_t i = 0; i < count; i++) {
total += ptr[i]; // Index into the data with `i`
}
printf("total is %lu\n", total);
printf("count is %zu\n", count);
// Perform the division with `double` math
return 1.0 * total / count;
}
... и назвал это
// mean = findmean( &test[0] , length_data);
// Declare `mean` and initialize in one step.
double mean = findmean_alt(sizeof test/ sizeof test[0], test);
int
не имеет десятичной точки.