0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 53
|
||||||||||||||||
1 | ||||||||||||||||
Неправильно отнимаются числа типа float(double)06.02.2019, 18:11. Показов 2476. Ответов 4
Метки нет (Все метки)
Сразу говорю, что перезайти в решение - не вариант.
Итак, у меня есть малюсенькая нейронная сеть, но это так, что б понимать код, но смысл не в этом. В ней есть поле Error. При вызове функции Evaluate(подсчитать) рассчитывается значение Error. Первые 5 "генераций" всё хорошо, однако на шестой при отладке я вижу: Error = 1 - 0.6. Но Error = 0.383333333. Как так то? Neuron.cs:
0
|
06.02.2019, 18:11 | |
Ответы с готовыми решениями:
4
Неправильно сравнивает числа типа double Как сгенерировать случайное число типа я double имея на входе 2 числа типа double - минимальное и максимальное Преобразование типа double во float Неправильно работает cout для чисел типа double и float |
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
06.02.2019, 18:34 | 2 |
Сообщение было отмечено C_programmer как решение
Решение
Арифметические операции с числами с плавающей запятой склонны к наличию ошибок, а если операции производятся в цикле, как у вас, то эта ошибка имеет свойство еще и накапливаться.
Более того, размер ошибки может различаться в зависимости от процессора, на котором производятся вычисления. Например, у меня ваш код на шестой итерации выдает значение 0.399999976. Ситуацию может усугублять еще и то, что в шарпе разрешено производить вычисления с бóльшим типом, чем тип переменной. То есть у вас float, а рантайм может производить вычисления в double, после чего делать приведение double к float, что нередко приводит к появлению дополнительных ошибок. Если вам важна точность десятичной части, то используйте decimal или на каждой итерации округляйте значение до нужного вам количества знаков после запятой.
1
|
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 53
|
|
06.02.2019, 19:17 [ТС] | 3 |
Спасибо, насчёт того что у вас на 6той итерации получается 0.399 и так далее, это так и у меня, я просто написал на глаз, как запомнил
Добавлено через 36 минут decimal мне не помог, а округление не точно, но всёравно спасибо за ответ. Добавлено через 3 минуты Сорян, decimal всётаки помог!
0
|
07.02.2019, 01:33 | 4 | |||||
Если у вас получается 0.399, то что вас смущает? Что оно не точно 0.4? Так это всегда так будет для чисел с ограниченной точностью.
Только вот учтите, что decimal будет работать намного медленнее чем float или double. На порядки медленнее. Что для нейронки будет очень даже критично на больших масштабах. А вот так писать точно нельзя. Вычисляемые значения с плавающей запятой вообще нельзя сравнивать через == или !=. Нужно сравнивать вот так:
0
|
0 / 0 / 0
Регистрация: 11.04.2018
Сообщений: 53
|
|
07.02.2019, 11:36 [ТС] | 5 |
Окей, спасибо за совет, а нейронка это маленькая, по этому decimal норм подходит
0
|
07.02.2019, 11:36 | |
07.02.2019, 11:36 | |
Помогаю со студенческими работами здесь
5
2-ичное представление числа типа double или float? Нужна компонента: что-то типа StringGrid, но значения ячеек должны иметь тип числа (float, double и т.д.) Передача переменной типа double из c# в переменную типа float в SQL Преобразовать 2 числа int в 1 число float(double) | double int1.int2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |