![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Есть код
http://liveworkspace.org/code/56a6afbdb322...e351b2af54057a7 выводит
Вопрос. Почему почему выводит "zzz" и не выводит "xxx yyy" ? Спасибо. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
потому что x*y может быть равен 0,999999999999999999999999999999999999999999999999999
![]() Поэтому все операции с действительными числами нужно производить через эпсилон. |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
bsa, это не объясняет результата.
Не помогает
добавляем
1. Получается: все промежуточные вычисления промежуточные ведутся в long double 2. По стандарту они должны идти в double - поэтому приведение к (double) игнорируется как бесполезная операция. 3. При присваивании переменной компилятор вынужден сделать приведение типа. И вот Вам результат ... |
||||
|
|||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
это я знаю. вопрос более теоретический. Если
то почему при присвоении этого к z что-то меняется ? Добавлено через 2 минуты и 41 секунду судя по этому - http://liveworkspace.org/code/f22c5b620f53...feb5fcb6adb8c81 - в double -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Я же писал
По той же причине sizeof(x*y) равен sizeof(double). |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ещё один момент: в 2008-й студии печатает
![]() Добавлено через 3 минуты и 52 секунды math64, я тут подумал... да.... похоже Вы правы. Господа, вам не кажется, что это - глюк компилятора ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Никаких глюков, два вариант могут существовать во вселенной
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
т.е. (float) не игнорируется. Ещё результат может зависеть от оптимизации. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
У меня нет возможности посмотреть ассемблерный код, который генерит GCC. Если кто-нибудь не поленится и выложит сюда - буду благодарен.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
gcc 3.4.2 mingw
|
||||
|
|||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
math64, спасибо.
это я, пожалуй, погорячился... ничего не понятно. все четыре сравнения кажутся одинаковыми = =
= =
Добавлено через 1 минуту и 18 секунд я имел в виду: кто-нибудь может прокомментировать приведённый ассемблер ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
math64 |
|
||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Используются разные ассемблерные команды.
нет сохранения результата умножения, за умножением сразу идёт сравнение
Это сообщение отредактировал(а) math64 - 12.9.2012, 07:26 |
||||||||||||||
|
|||||||||||||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Кстати, в 64х битной версии gcc печатает и zzz и xxx yyy
И при включении уровня оптимизаций -O3 (для 32х битной) тоже печатает оба У меня на gcc (64 бита на Linux, версия 4.1.2) код немного получился другой, но суть та же Вариант с промежуточной переменной:
Без промежуточной переменной:
|
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
жесть... всегда был уверен (не знаю почему), что 64 и 32 бита отличаются лишь работой с памятью, размером указателей и т.п., а операции с числами (int не берём) абсолютно одинаковые. Что ж... ошибался -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Но в данном случае при уменьшении точности получаем более точный результат, о чем говорили в теме
исползование double вместо float http://forum.vingrad.ru/forum/topic-355758.html Добавлено через 14 минут и 2 секунды Если бы компилятор работал бы по стандарту - так и было бы. Т.е. после каждой операции нужно было бы выгружать результат во временную переменную и загружать в FPU снова. Но это потеря во времени, и как правило, потеря точности (данный пример, когда при округлении получаем более точный результат - исключение), поэтому проводится оптимизация. Пользователь от этого обычно не страдает. Вот в начале 80-х была другая ситуация. Машина - PDP-11/70, 16 разрядная. Компилятор Fortran-77. Нужно 32 разрядное целое. Пишем INTEGER*4 I Компилятор съедает, но I - 16 разрядная. Спрашиваем: Почему игнорируется *4? Ответ: потому что по стандарту фортрана INTEGER и INTEGER*4 - одно и то же. В: А почему тогда INTEGER 16 разрядный? О: Потому что процессор 16 разрядный Приходится использовать REAL |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |