-
Странное дело. Есть такой код:
var
t: double;
t := (1 / 1000);
С включенной опцией компилятора Optimization получается число QNAN.
Без оптимизации все нормально.
Кто нибудь сталкивался? И как можно это дело обойти?
Delphi XE6.
-
1.0/1000.0
-
1 и 1000 целочисленные.
-
как узнал, что там QNAN ? (32/64?)
-
Через FloatToStrF выводит строку NAN и в Watch List добавил переменную.
-
64
-
> dmk © (14.01.17 20:28) [2]
>
> 1 и 1000 целочисленные.
Это ты так считаешь. На самом деле что 1, что 1000 это константы неопределенного типа. Как их использует компилятор - знает только он.
-
Ставь точку останова и показывай асм/регистры
-
Да с регистрами все в порядке. Сразу после расчета 0.001 получается. Сделал переменные глобальными — стало все в порядке, а так компилятор рушил локальные переменные, хотя и не должен.
Получается так:
1. f := 1/1000;
2. Какие-то другие расчеты
3. Вызов внешней процедуры
4. Тут происходит слет внутренних переменных.
5. Использование переменных невозможно из-за слетевшего значения
А не должно быть так вроде :(
-
> 3. Вызов внешней процедуры
с этого момента поподробнее ))
-
Тут дело в оптимизации в общем. Когда она включена, то переменные по возможности хранятся в XMM-регистрах, а когда выключена в памяти. Отсюда и слет при внешнем вызове. У меня XMM-регистры используются.
-
Видимо недоработка компилятора.
-
-
Да не, с передачей параметров у меня порядок. Какого черта компилятор переменные помещает в регистры?
-
-
>а как иначе процессору работать с переменными ?
Процессор тут не при чем. Это компилятор распихивает переменные. В случае оптимизации в регистры. Без - в память. Отсюда и глюк.
-
> В случае оптимизации в регистры.
и глюк в том, что ты тоже используешь эти регистры (из асм кода) не сохранив/восстановив их значение?
-
Ну да. Именно так. Подстава от компилятора :)
-
У меня просто оптимизация никогда не включалась. По умолчанию она выключена.
-
Так кто кого подставил?