Мой психический смысл подсказывает мне, что eyex
объявлено как int
, а не как double
, как должно быть. Когда вы назначаете ему -1000.0, оно усекается до целого числа -1000 (ваш компилятор должен выдать вам предупреждение здесь), которое представляется в двоичном виде как 0xFFFFFC18 с использованием двоичной нотации дополнения. Аналогично, при условии, что eye
также является целым числом, его значение 0 представляется в двоичном виде как 0x00000000.
Когда вы передаете eyex
, eyey
и другие параметры в printf
, они помещаются в стек, чтобы они лежали в памяти с увеличивающимися адресами. Поэтому непосредственно перед инструкцией call
для вызова подпрограммы кадр стека выглядит примерно так:
<top of stack>
0xFFFFFC18 ; eyex
(4-8 bytes) ; vx
0x00000000 ; eyey
(4-8 bytes) ; vy
(4-8 bytes) ; vz
Когда printf
видит спецификатор формата %f
, который говорит: «возьмите 8 байтов из стека, интерпретируйте их как значение double
и распечатайте это значение double
». Таким образом, он видит значение 0xFFFFFC18xxxxxxxx, где xxxxxxxxx - это значение info->vx
. Независимо от этого значения, это IEEE 754 представление NaN, или "не число". У него установлен бит знака, поэтому некоторые реализации могут интерпретировать это как «отрицательный NaN», хотя это имеет ту же семантику, что и обычный NaN.
Ваш компилятор также должен предупредить вас, что вы передаете неправильные типы аргументов в printf
- он ожидает double
, но вы его не передаете. GCC включает эти предупреждения с помощью -Wall
, что я настоятельно рекомендую включить.
Итак, решение состоит в том, чтобы объявить eyex
типа double
(и, предположительно, другие переменные также будут double
, если они еще не были). В качестве альтернативы, если вы не контролируете определение eyex
и др. (Скажем, потому что они являются частью структуры сторонней библиотеки), то вместо этого вам следует распечатать их с %d
модификатор для печати их в виде целых чисел, а не с %f
, и вы также должны назначить им целочисленные значения, такие как -1000 и 0, а не значения с плавающей запятой, такие как -1000.0 и 0.0.