Aidar
Сравнение символов на самом деле тоже неопределено
Крылатый
Aidar
Потомучто не понятно по чему это делать
Крылатый
Типы тут спасут.
Anonymous
max() строк не надо, плохо
Oleg
Aidar
По коду в юникол таблице?
Anonymous
Только числа, только хардкор.
Anonymous
В идеале только действительные.
Aidar
Egor
Aidar
Или по коду в какой-то другой кодировке
Крылатый
И ИМХО, тут даже не требуются зависимые типы.
Anonymous
Какая-нибудь китайская кодировка?
Anonymous
Нет, символы нельзя сравнивать.
Oleg
более того, что будет, если ты сравниваешь int И double? Кто должен к кому кастоваться? Если первый ко второму, то все ок, а если второй к первому, то все плохо
Anonymous
C long long и double тоже весело
Vitaliy
Anonymous
unsigned long long
Anonymous
Максимальный ull настолько большой, что точность float там ниже единицы
Anonymous
*double тоже
Vitaliy
Тогда и это не должно компилиться ?
int main() {
return 4uLL < 5.0;
}
Anonymous
Э, нет.
Anonymous
4 достаточно маленький.
Anonymous
double теряет точность на БОЛЬШИХ числах.
🐙 Antony
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
Anonymous
double это не decimal, у него точность неравномерная.
Square
Vitaliy
Square
пока читал про алиасинг, нашел такую репу:
https://github.com/rbock/reasoning-about-names
Anonymous
Anonymous
Но на больших числах шаг значений double становится больше единицы.
Anonymous
🐙 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.
Vsevolod
Или сменить определение "человеческая логика"
Vsevolod
2+2=4, а не 3.9999999999998763, как в x87, и то хлеб
Aleksander
Anonymous
И сомнительно относительно rational.
Vsevolod
Внезапно все операции с даблами делаются примерно за то же время, что и с целыми той же разрядности
Vsevolod
См. Агнера
Berkus
80 БИИИТ
Thorn
что такое decimal? это не fixed point?
Anonymous
Это когда ты, условно говоря, хранишь число как набор его цифр + положение точки.
Vsevolod
Сохрани число пи тогда, бггг
Anonymous
Меньше диапазон, чем у double, зато всегда одинаковая точность, можно сравнивать, не накапливаются ошибки.
Thorn
ну там q1.14 — это оно или нет?
Vsevolod
Ну да, а потом умножить пи на 32
Vsevolod
В дабле элементарно
Vsevolod
А в fixed point - потеря точности
Anonymous
pi * 32.
Я пользуюсь библиотеками, а не реализую вручную.
Anonymous
Но вообще я не очень часто умножаю пи на 32
Vsevolod
Я к тому, что везде свои особенности
Anonymous
Если тебе нужно часто выполнять такие операции, тогда да, нужен double
Egor
Vsevolod
Да и от суммы накапливается