я реализую проект в C, появилась тема, что я надеюсь, что сообщество может помогать мне.
Я использую десятичные числа в частности тип информации - Float. Напечатав мой output я вижу, что C он делает вид округления. Например:
Числа, которое он был бы должен печатать.0751632 и он печатает.0800000
Форма, в которой я печатаю:
printf("%f\n",aux_no->rutas[y]);
Переменная "aux_no" - структура с array "маршрутами" как один из Ваших членов, этот array - типа float.
Не, если бы он был должен изменять Double тип информации?
Как я могу делать для того, чтобы он прекратил округлять таким образом?
Благодаря всем из-за того, что читает.
array, который ты определяешь внутри внутри твоей структуры, должен быть тип double
:
double rutas[] = {91.023, 0.0751632, 2.03, 3.432, 7.023};
, напечатав это, ты можешь делать это, как ты это выдвигаешь в твоем вопросе:
for(int y = 0; y<5; y++){
printf("%f\n",rutas[y]);
}
с этим ты заверяешь в том, что печатаешь желанную стоимость:
0.0751632
Кажется, нет способа воспроизводить этот эффект
#include<stdio.h>
int main(){
typedef struct aux_no_st{
float rutas[10];
} aux_no_t;
aux_no_t aux_no_var;
aux_no_var.rutas[1]= 0.0751632;
aux_no_t *aux_no=&aux_no_var;
int y=1;
printf("%f",aux_no->rutas[1]);
}
Я получаю этот результат
0.075163
ВїPodrГ-Схвати тестировать это и видеть, продолжает ли он происходить?
Поведение в C на типе float и double - тот же самый, будет выполнять тебя то же округление.
В книжном магазине math.h http://www.gnu.org/software/libc/manual/html_node/Rounding-Functions.html ты можешь видеть различные доступные функции округления. Какие-то примеры:
#include <math.h>
float val = 0.751632;
float rounded_down = floorf(val * 1000) / 1000; /* Result: 0.751 */
float nearest = roundf(val * 1000) / 1000; /* Result: 0.752 */
float rounded_up = ceilf(val * 1000) / 1000; /* Result: 0.752 */
, Если этого не достаточно, ты будешь должен делать твою собственную функцию для такого эффекта.
Правильный формат, чтобы определять точность, использованную из-за printf()
он:
%f.(n-decimales)
В твоем случае он был бы:
printf("%f.7\n",aux_no->rutas[y]);
С этим были бы видны 7 десятичных числа, которое ты разместил примера.
Но еще не определяя стоимости 7, стандартная настройка - 6 десятичных а следовательно ты был бы должен получать
0.075163
Следовательно ошибка с округлением или форматом находится более назад вероятно в ассигновании в array.
Округление - тема, которая затрудняется для тех, которые начинаются в этом мире. То, за чем оно последует, состоит в том, что точность float низкая, что показывает, что, сделав несколько операций, ошибку, которая накапливается, растет и ведет в результаты, которые различаются в высшей степени от реального результата. Взамен, переменные double дают нам возможность содействовать немного этой проблеме, так как количество бит, которые берутся за то, чтобы манипулировать частью точности double, - почти двойная порция тех float, следовательно, он, из-за muuucho, более точный. especificador превращения, ассоциируемый с double - %lf.