Я выполняю сложение 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 не добавляется. В чём может быть проблема?
Берем вашу константу и смотрим на фактическое значение переменной и следующее представимое значение в рамках 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 все таки ближе. Поэтому никакого прибавления и не происходит.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей