Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Оптимизация и Double


dmk ©   (14.01.17 16:01

Странное дело. Есть такой код:

var
 t: double;

t := (1 / 1000);

С включенной опцией компилятора Optimization получается число QNAN.
Без оптимизации все нормально.

Кто нибудь сталкивался? И как можно это дело обойти?
Delphi XE6.


rrrrr ©   (14.01.17 18:02[1]

1.0/1000.0


dmk ©   (14.01.17 20:28[2]

1 и 1000 целочисленные.


NoUser ©   (15.01.17 00:29[3]

как узнал, что там QNAN ? (32/64?)


dmk ©   (15.01.17 01:54[4]

Через FloatToStrF выводит строку NAN и в Watch List добавил переменную.


dmk ©   (15.01.17 01:54[5]

64


Германн ©   (15.01.17 03:12[6]


> dmk ©   (14.01.17 20:28) [2]
>
> 1 и 1000 целочисленные.

Это ты так считаешь. На самом деле что 1, что 1000 это константы неопределенного типа. Как их использует компилятор - знает только он.


NoUser ©   (15.01.17 03:14[7]

Ставь точку останова и показывай асм/регистры


dmk ©   (15.01.17 12:58[8]

Да с регистрами все в порядке. Сразу после расчета 0.001 получается. Сделал переменные глобальными — стало все в порядке, а так компилятор рушил локальные переменные, хотя и не должен.

Получается так:
1. f := 1/1000;
2. Какие-то другие расчеты
3. Вызов внешней процедуры
4. Тут происходит слет внутренних переменных.
5. Использование переменных невозможно из-за слетевшего значения

А не должно быть так вроде :(


NoUser ©   (15.01.17 17:35[9]

> 3. Вызов внешней процедуры
с этого момента поподробнее ))


dmk ©   (15.01.17 19:56[10]

Тут дело в оптимизации в общем. Когда она включена, то переменные по возможности хранятся в XMM-регистрах, а когда выключена в памяти. Отсюда и слет при внешнем вызове. У меня XMM-регистры используются.


dmk ©   (15.01.17 19:56[11]

Видимо недоработка компилятора.


NoUser ©   (15.01.17 23:11[12]

> У меня XMM-регистры используются.
ну-у, может и не только у тебя они используются?

Видимо тебе нужно узнать, как договорится об их совместном использовании.
(https://msdn.microsoft.com/ru-ru/library/zthk2dkh.aspx)


dmk ©   (16.01.17 01:27[13]

Да не, с передачей параметров у меня порядок. Какого черта компилятор переменные помещает в регистры?


NoUser ©   (16.01.17 01:41[14]

а как иначе процессору работать с переменными ?

++
(https://msdn.microsoft.com/ru-ru/library/9z1stfyw.aspx)


dmk ©   (16.01.17 13:50[15]

>а как иначе процессору работать с переменными ?

Процессор тут не при чем. Это компилятор распихивает переменные. В случае оптимизации в регистры. Без - в память. Отсюда и глюк.


NoUser ©   (16.01.17 15:32[16]


>  В случае оптимизации в регистры.

и глюк в том, что ты тоже используешь эти регистры (из асм кода) не сохранив/восстановив их значение?


dmk ©   (16.01.17 20:34[17]

Ну да. Именно так. Подстава от компилятора :)


dmk ©   (16.01.17 20:36[18]

У меня просто оптимизация никогда не включалась. По умолчанию она выключена.


Германн ©   (17.01.17 01:09[19]

Так кто кого подставил?


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо