Ivan
Случай простой double d = 0.0; if (d == 0.0) cout << 1;
Ioann_
нет
Почему ? Их компилятор во врнмя сборки переводит в байт код
ГуНиСе️
double d = 0.0 может побайтово разное в разных случаях?
бывает плюс ноль, а може быть минус ноль
ГуНиСе️
и они побитово отличаются
Ioann_
И побобайтово сравнивает. Поскольку это далал один и тот же компилятор - то оно будет одно и тоже.
Ioann_
Ну я имею ввиду - битовое представление
Ivan
double d() { return 0.0; } может вернуть минус ноль?
Ioann_
А вот если эти числа получены при вычислениях - то тут уже будет погрешность.
Ioann_
И та, в 16 знаке
Олександр
0.0 это ноль а не минус ноль
ГуНиСе️
в байт код! ништяк
но в байт-код тоже переводит, правда лишь только для внутренних целей при трансляции
Anatoly
Случай простой double d = 0.0; if (d == 0.0) cout << 1;
о равенстве флоатов можно говорить только с точность до
Berkus
и тот на самом деле сериализация IR!
Ioann_
Я не спорю что я могу ошибаться. Но я собственными руками переводил строку в double. Без каких либо библиотек.
Олександр
Случай простой double d = 0.0; if (d == 0.0) cout << 1;
Это сработает, если именно везде будет константа 0.0
Anatoly
золотые руки
Ioann_
И это работало быстрее чем itof, std stod
Ivan
Я знаю, что нельзя сравнивать даблы друг с другом, но с 0.0 можно?
Олександр
Если же хочешь получить 0 в вычислениях, то сравнение не совсем корректно
Ivan
Ибо 0.0000001 это ошибка ибо не ноль
Ioann_
Еще фишки есть с nan
Ivan
Так, что дабла не бывает т пустого никогда?
Олександр
Константа 0 это совсем 0
Ioann_
Например double a = nan
Ivan
OK
Berkus
бывает еще полный дабл, это Inf
Ioann_
a == nan
Ioann_
Выдаст false :)
Олександр
Ivan
Перефразирую
Ioann_
Таким образом работает isnan - return !(a == nan)
Ivan
bool b = 0.0 == 0.0 всегда true?
Олександр
Да
🐙 Antony
Почему ? Их компилятор во врнмя сборки переводит в байт код
Чисто теоретическая возможность: Была весёлая фишка. какой-то из процессоров при работе с float переводил их сначала в double делал вычисления, потом конверировал обратно. И кажется порой он мог перевоодить только один операндов. Подозреваю что могут быть процессоры, которые делают похожую чушь для double и long double, и у них такие приведения могут лажануть
Ivan
То есть константа 0.0 всегда одинакова в бинарном виде?
🐙 Antony
С другой стороны, такой проц будет жуткой упячкой... Мало кто будет им пользоваться и его выкинут на свалку :)
Олександр
Олександр
Только там знаков больше
🐙 Antony
Явно не в духе интела :)
Ага, совсем не в духе Itanium
Ivan
То есть с 0.0 всё-таки можно сравнивать?))
Ioann_
Ага, совсем не в духе Itanium
Но даже если так, сначала перед ввчмслениями double надо в регисьры перевести.
Ioann_
И вот этот перевод будет одинаков
Berkus
а они там широооокие нынче
Berkus
регистры фпу обычно 80 бит
Ivan
Это в книге у Курта Гантерота написано было)
Anatoly
То есть с 0.0 всё-таки можно сравнивать?))
тебе надо удостоверится, что это именно твой иницилизатор? заведи константу const double ZERO = 0;
Олександр
То есть с 0.0 всё-таки можно сравнивать?))
Можно, если то, что сравниваешь, равняется константе 0.0, а не получилось в вычислениях (это должно нереально повезти)
Ioann_
И даже если он будет делать какие либо вычисления с теми же битами, резулььат должен бы быть один
Anatoly
тогда double a = ZERO, b = ZERO; assert(a == b);
Олександр
Низя
Олександр
Разве что дельту сравнивать
Олександр
delta < 1e-5 например
Ivan
Низя
Нельзя потому что результат может быть не побайтово нулём? Главное что правая часть всегда правильный ноль. Пусть вернёт false
Ioann_
Еще есть методы коменсации погрешности - например Шевчука
Ioann_
Мягко говоря дабл из 64 бит превращается по точгости в 128
Ivan
То есть false при любой погрешности
Ioann_
А флоат в дабл по точности
Ivan
Это меня устраивает
Олександр
При любой больше точности double
Berkus
https://godbolt.org/g/LscNcY
Ivan
Было бы обидно, если бы результат вычислений был "правильным нулём", а 0.0 был бы неправильным...