Способ, которым работают printf
, заключается в том, что он принимает «вариационные параметры». Это означает, что аргументы не известны внутри printf, вместо этого используется некоторый «волшебный» код для их возврата. printf
использует строку формата, в данном случае "%d"
, чтобы определить, какой тип аргумента - int
в случае "%d"
. Поскольку z
на самом деле является float
, он напечатает целочисленное представление z
- это, вероятно, какое-то действительно большое количество. [1]
Вы должны исправить свой код, чтобы использовать нужный формат, в этом случае "%f"
кажется хорошим выбором.
Большинство современных компиляторов также имеют возможность проверить соответствие строк формата и фактических аргументов, поэтому вы должны включать предупреждения при компиляции кода, чтобы дать вам осмысленное (ish) сообщение о том, что вы не передали правильный аргумент ,
[1] В x86-64 на Linux по крайней мере аргумент float передается в регистры SSE и сохраняется в отдельном куске памяти, поэтому несогласованные аргументы не будут печатать целочисленное представление float, оно напечатает некоторые " случайный "номер, из которого были бы отправлены целые числа.
В чем проблема __exactly__? Прочтите свой вопрос вслух. «Я получаю странные цифры там» - ужасное описание проблемы. –
Когда вы используете '% d', аргумент должен быть' int', а не 'float'. При вызове переменных функций нет автоматического преобразования. – Barmar
Предположительно, почему 'printf («% d », somefloat);' не печатает целочисленное значение (sane) для float? –