Не выполняется сложение с float

102
28 августа 2021, 12:20

Я выполняю сложение float + float. Мне надо в цикле прибавить к массиву типа float значение переменной Eps=0.0001. Вначале, когда числа равны целым, то все проходит нормально, но когда они становятся приблизительно равным 2309.786621,то сложение не происходит.

    float Eps = 0.0001;
    for (int i = 0; i < counter; i++) {
        for (int j = 0; j < unkPar; j++) {
            //нужное сложение
            w[j] += Eps;
            float temp = func(w[0], w[1], w[2], w[3], mX[i]);
            w[j] -= Eps;
            massJac[i][j] = (temp - func(w[0], w[1], w[2], w[3], mX[i])) / Eps;
        }
    }
}

В результате получается 0,потому что Eps не добавляется. В чём может быть проблема?

Answer 1

Берем вашу константу и смотрим на фактическое значение переменной и следующее представимое значение в рамках IEEE754 float

#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
  float f = 2309.786621f;
  printf("%.20f\n%.20f\n", f, nextafterf(f, FLT_MAX));
} 

Получаем

2309.78662109375000000000
2309.78686523437500000000

То есть, во-первых, никакого 2309.786621 быть не может. Вы работатете с 2309.78662109375. И ваше 0.0001 на самом деле является 0.0000999999974737875163555145263671875.

И, во-вторых, следующее представимое значение отстоит от этого значения на 0.00024414062. Следовательно сумма 2309.78662109375f и 0.0001f не представима в типе float. Сумма 2309.78662109375f + 0.0001f должна либо округлиться назад к 2309.78662109375f, либо вперед к 2309.786865234375f - смотря что ближе. Очевидно 2309.78662109375f все таки ближе. Поэтому никакого прибавления и не происходит.

READ ALSO
Помогите разобраться с интерфейсом

Помогите разобраться с интерфейсом

При попытке скомпилировать проект возникает ошибка

113
Как изменить цвет конкретного текста для вывода в консоль а не всей консоли?

Как изменить цвет конкретного текста для вывода в консоль а не всей консоли?

Я хочу отдельный вывод в программе выделить с помощью цветовНо при использовании таких вариантов как например:

171
оповещение о подключении к сети

оповещение о подключении к сети

Есть ли в линукс какое нибудь оповещение, когда подключаешься к сети? Это для программированияЯ хочу отслеживать интерфейс например, но не знаю...

117
собрать данные из DIV в JSON

собрать данные из DIV в JSON

Есть динамически сформированная корзина заказа (условно):

184