У меня есть программа, которая находит пути в графе и выводит совокупный вес. Все ребра на графике имеют индивидуальный вес от 0 до 100 в виде поплавка с не более чем двумя знаками после запятой.0 + 0 + 0 ... + 0! = 0
В Windows/Visual Studio 2010 для конкретного пути, состоящего из ребер с весом 0, он выводит правильный общий вес 0. Однако в Linux/GCC программа говорит, что путь имеет вес 2.35503e-38
. У меня было много опыта с сумасшедшими ошибками, вызванными поплавками, но когда 0 + 0 когда-либо равнялось бы чему-либо, кроме 0?
Единственное, что я могу думать об этом, заключается в том, что программа обрабатывает некоторые из весов как целые числа и использует неявное принуждение, чтобы добавить их в общую. Но 0 + 0.0f все равно равно 0.0f! В качестве быстрого решения я уменьшаю итоговое значение до 0 при менее 0,00001, и этого достаточно для моих нужд. Но что это такое?
Примечание: Я 100% уверен, что ни один из весов в графе не превышает диапазон я уже говорил, и что все веса в данном пути равны 0.
EDIT: Выработать , Я попробовал как считывать веса из файла, так и устанавливать их в коде вручную как равное 0.0f. Никакая другая операция не выполняется над ними, кроме добавления их в общую.
Можете ли вы построить минимальный тестовый чехол? –
@ OliCharlesworth Это то, что я пытался сделать, до сих пор не повезло. Количество соответствующего кода слишком много для публикации, но я буду продолжать пытаться воспроизвести ошибку в меньших масштабах. Я надеялся, что это будет очевидной аргументацией. –
Я бы рекомендовал вам изучить определение машинного эпсилона. Похоже, это то, что вызывает вашу ошибку здесь. – andre