| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Целочисленные типы в выражениях |
| Автор: S.A.G. 27.3.2008, 09:28 | ||||||||
Значит так, имеем код, он ВЫПОЛНЯЕТ нужную задачу - начиная с 13 по 19 место заполняет массив числом 10000.0..:
Но почему вот такой код НЕ приносит желаемый результат:
Или может следует даже вот так записать, чтобы сравнивать плавающие типы с одинаковой точностью(?):
Я всегда знал, что если:
, то i будет равно 2. Но если имеем выражение (i / 2), разве оно не должно быть типа double = 2.5 по стандарту??? А то пришлось явно приводить i к float перед делением! |
| Автор: korian 27.3.2008, 09:49 | ||
| если целое делиться на целое - результат целое решение: надо один из типов перевести в float
|
| Автор: S.A.G. 27.3.2008, 09:55 | ||
Я думал, что это проявляется только при присвоении переменной целого типа значения типа не целого. Но в выражениях!.. Добавлено через 10 минут и 2 секунды Но тогда можно не заморачиваться и просто записать проверку на парность:
Тут double сравнивается с double? Числовые плавающие константы в С, я знаю, имеют тип double, а в С++ тоже так? |
| Автор: mes 27.3.2008, 11:07 |
если нужен дробный тип дели так (i/2.0) |
| Автор: Earnest 27.3.2008, 11:35 |
| Что-то я не пойму - это ты так четность проверяешь? |
| Автор: S.A.G. 27.3.2008, 12:20 | ||
Вот этим(?):
Ну да. Добавлено через 32 секунды ? |
| Автор: Sleepless 27.3.2008, 12:40 |
http://forum.vingrad.ru/forum/topic-202920.html |
| Автор: inside_pointer 27.3.2008, 13:02 | ||
Чтобы i само привелось к double надо поставить 2.0, результат тоже будет double, и j даже если оно целое, в операции сравнения с этим результатом тоже должно преобразоваться в double. А при делении i / 2 если i целое, то 2 к double не приводится, и результат соответственно тоже не получается как double, а идёт как int, у которого нет дробной части. |
| Автор: S.A.G. 27.3.2008, 17:12 |
| Sleepless, мой метод тоже подходит. |
| Автор: vinter 27.3.2008, 17:17 |
угу, только если так писать то в конце концов разгневанный человек ,смотрящий твой код, придет к тебе ночью с холодным оружием.. |
| Автор: Sleepless 27.3.2008, 17:20 |
В общем случае, Ваш метод может не работать из-за ограниченной точности представления вещественных чисел. |
| Автор: S.A.G. 27.3.2008, 17:56 |
| Sleepless, ага, может не совпасть на 0.00000001 или около того. Вобщем, забыл я такой простой оператор - целочисленное деление. |
| Автор: Earnest 27.3.2008, 19:08 |
Да, для шифрования кода. S.A.G., настоящие C-программеры проверяют четность так: i&1 Хотя, конечно, нынче компиляторы из i%2 делают то же самое... |
| Автор: S.A.G. 27.3.2008, 19:14 |
| Earnest, i&1? |
| Автор: baldina 27.3.2008, 20:08 |
| S.A.G., i&1 - проверка младшего бита. вспомни, что числа у нас в двоичной системе, каждый разряд кратен степени двойки. потому вот... |
| Автор: Sleepless 28.3.2008, 11:25 |
ИМХО, идеальный компилятор должен привести оба варианта к сдвигу вправо и анализу полученного бита... Кстати, VS 2005 для двух вариантов сгенерирует разный код, причем сдвига не будет ни в одном из них. |
| Автор: bsa 28.3.2008, 13:57 | ||
Это откуда такая уверенность? Ты думаешь, скорость выполнения сдвига выше, чем у операции AND? |
| Автор: Sleepless 28.3.2008, 14:14 |
100% уверенности нет, т.к. обе операции регистровые. Только "И" требует 2 операнда... Ладно, пороюсь на досуге в Интеловской локументации |
| Автор: baldina 28.3.2008, 14:19 |
| Sleepless, был удивлен, проверил. Все-таки оно одинаковый код генерит... |
| Автор: baldina 28.3.2008, 14:29 | ||
Если честно, на 2005 не проверял. Проверял на 2003 и 2008. Они генерят абсолютно одинаковый код. Потому думаю, что и 2005 не выделяется.
Добавлено через 3 минуты и 40 секунд unsigned abc; если тип знаковый, код, понятно, будет разным... |
| Автор: Sleepless 28.3.2008, 14:54 | ||
Хм... Ты прав... Я ошибся :( Интересно, куда я смотрел? Может кто-нибудь привести код, сгенерированный не MS-компилятором? |
| Автор: korian 28.3.2008, 14:58 |
я вообще не понимаю о чем тут спорить... тогда уж надо проверить все компиляторы, причем на каждом проверить все платформы (x86, x486... Core2Duo, потом AMD т.д.) и после этого можно будет только составить статистику, какой код генерится чаще. |
| Автор: Любитель 30.3.2008, 00:03 |
| Я за энд |
| Автор: Mayk 30.3.2008, 10:29 | ||||||||||
gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2):
q3lcc. версию умалчивает. как он связан с ку3 не помню.
tcc: Information: Version: 4.0, Machine: linux-*-80x86, Release: TenDRA-4.1.2.
искать другие компиляторы в лом. |
| Автор: Любитель 30.3.2008, 10:47 | ||||
и
хде отличие? |
| Автор: bsa 30.3.2008, 11:28 | ||
ICC:
|