Vitaliy
Её обмазать нужно коньтрактами, ИМХО.
Имеешь ввиду требованиями на типы ? (аля концепты)
Aidar
Сравнение символов на самом деле тоже неопределено
Aidar
Потомучто не понятно по чему это делать
Крылатый
Типы тут спасут.
Anonymous
max() строк не надо, плохо
Aidar
По коду в юникол таблице?
Anonymous
Только числа, только хардкор.
Anonymous
В идеале только действительные.
Aidar
По коду в юникол таблице?
Или по коду символа
Aidar
Или по коду в какой-то другой кодировке
Vitaliy
что будет, если я туда передам int и string?
Не скомпилится, т.к. для них нет оператора < >
Крылатый
И ИМХО, тут даже не требуются зависимые типы.
Anonymous
По коду в юникол таблице?
Юникод? Или, может, CP1251? Или KOI8?
Anonymous
Какая-нибудь китайская кодировка?
Anonymous
Нет, символы нельзя сравнивать.
Oleg
более того, что будет, если ты сравниваешь int И double? Кто должен к кому кастоваться? Если первый ко второму, то все ок, а если второй к первому, то все плохо
Anonymous
C long long и double тоже весело
Anonymous
Скорее должен вывестись общий тип
Давай, общий тип для long long и double.
Anonymous
unsigned long long
Oleg
C long long и double тоже весело
и я даже не буду говорить про сравнением с float
Vitaliy
Давай, общий тип для long long и double.
А в чём проблема ? У double больший диапазон.
Anonymous
А в чём проблема ? У double больший диапазон.
double намертво теряет точность на больших числах.
Anonymous
Максимальный ull настолько большой, что точность float там ниже единицы
Anonymous
*double тоже
Vitaliy
Тогда и это не должно компилиться ? int main() { return 4uLL < 5.0; }
Anonymous
Э, нет.
Anonymous
4 достаточно маленький.
Anonymous
double теряет точность на БОЛЬШИХ числах.
Vitaliy
double теряет точность на БОЛЬШИХ числах.
То есть когда-то кастование приведёт к тому, что результат неверный математически будет ?
Anonymous
Да.
Anonymous
$ cat test.c #include <stdio.h> #include <limits.h> int main() { double a = 18446744073709551615ULL; // ULL max on my system double b = a + 1; printf("%d", a == b); return 0; } $ gcc test.c $ ./a.out 1
🐙 Antony
это когда "память" пересекается? или наоборот не пересекается? ну всмысле эвристики этого процесса?
Эта эвристика позволчет компилятору догадаться что два указателя никогда не указывают на одну и ту же ячейку памяти и соответственно позволяют не перечитывать значение по первому указателю при хаписи через второй
Anonymous
double это не decimal, у него точность неравномерная.
Aleksander
Вы пишите только hello words?
Нет. Я пишу в условиях маленькой кучи и отсутсвии кеша. И исключения не поддерживаются.
Vitaliy
$ cat test.c #include <stdio.h> #include <limits.h> int main() { double a = 18446744073709551615ULL; // ULL max on my system double b = a + 1; printf("%d", a == b); return 0; } $ gcc test.c $ ./a.out 1
int main() { std::cout << (std::numeric_limits<unsigned long long>::max() < std::numeric_limits<double>::max()); return 0; } выводит 1
Square
пока читал про алиасинг, нашел такую репу: https://github.com/rbock/reasoning-about-names
Anonymous
Но на больших числах шаг значений double становится больше единицы.
🐙 Antony
Нет. Я пишу в условиях маленькой кучи и отсутсвии кеша. И исключения не поддерживаются.
А интрузивными контейнерами из какой библиотеки пользетесь?
Anonymous
IEEE754, non verpa canis est
Anonymous
Одна из причин, почему double/float зло, хоть и неизбежное порой, увы.
Vsevolod
Да ладно, зло
Vsevolod
Чай, не на x87 живем
Vsevolod
Вот там было зло с дребежжанием мантиссы
Anonymous
Зло. Лютое и бешеное. Если возможно надо использовать int, если невозможно decimal. И только в крайнем случае, когда производительность важнее всего — double.
Vsevolod
А тут не фигачить в дабл больше, чем 2^52-1, и все дела
Anonymous
.1 + .2 != .3, зато 18446744073709551615 + 1 == 18446744073709551615
Vsevolod
И?
Anonymous
Это противоречит любой человеческой логике. Лучше использовать int/decimal.
Aleksander
А интрузивными контейнерами из какой библиотеки пользетесь?
Слишком умное слово, потом загуглю. Из библиотек только tlsf , остальное самописное.
Vsevolod
Или сменить определение "человеческая логика"
Vsevolod
2+2=4, а не 3.9999999999998763, как в x87, и то хлеб
Anonymous
Ээ, производительность? Ничего не путаете?
Производительность double всяко выше, чем у decimal.
Anonymous
И сомнительно относительно rational.
Vsevolod
Внезапно все операции с даблами делаются примерно за то же время, что и с целыми той же разрядности
Vsevolod
См. Агнера
Berkus
80 БИИИТ
Thorn
что такое decimal? это не fixed point?
Anonymous
Это когда ты, условно говоря, хранишь число как набор его цифр + положение точки.
Vsevolod
Сохрани число пи тогда, бггг
Anonymous
Меньше диапазон, чем у double, зато всегда одинаковая точность, можно сравнивать, не накапливаются ошибки.
Anonymous
Сохрани число пи тогда, бггг
А ты мне в double сохрани сначала.
Thorn
ну там q1.14 — это оно или нет?
Vsevolod
Ну да, а потом умножить пи на 32
Vsevolod
В дабле элементарно
Vsevolod
А в fixed point - потеря точности
Anonymous
pi * 32. Я пользуюсь библиотеками, а не реализую вручную.
Anonymous
Но вообще я не очень часто умножаю пи на 32
Vsevolod
Я к тому, что везде свои особенности
Anonymous
Если тебе нужно часто выполнять такие операции, тогда да, нужен double
Vsevolod
Да и от суммы накапливается