Конференция "Основная" » Оптимизация и Double
 
  • dmk © (14.01.17 16:01) [0]
    Странное дело. Есть такой код:

    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]
    Так кто кого подставил?
 
Конференция "Основная" » Оптимизация и Double
Есть новые Нет новых   [118241   +23][b:0][p:0.001]