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