Как chqrlie правильно указал, printf("%d", somevariable)
ожидает, что переменная передается как int
, тогда как ваш результат - значение типа double
.
%d
называется спецификатором формата. Они необходимы, потому что разные типы данных передаются и интерпретируются разными способами процессором, возможно, в другом месте в памяти или в разных регистрах (как в случае платформы x86_64). Таким образом, даже одно и то же место памяти с одним и тем же битовым шаблоном может интерпретироваться по-разному на основе типа данных. Это то, что происходит в этом другом примере:
int main() {
int a = 1048577;;
printf("%d\n", a);
printf("%hd", a); //hd is the format specifier for short int
return 0;
}
выход:
1048577
1
Как вы видите, та же переменная а интерпретируется по разному в зависимости от того, что тип данных вы укажете.
Почему это так? Это двоичное представление 1048577 (предполагая, что 32-битный int
):
00000000 00010000 00000000 00000001
Если формат спецификатор short int
(%hd
), то это шорты 16 бит в ширину, только 16 младших бит порядка от значения , поэтому выход равен 1
.
Нечто подобное может происходить в вашем случае на некоторых архитектурах (x86 32 бит) или что-то хуже других те, где передается значение double
по-другому и printf
получает int
от места, где ничего конкретного не была написана вызывающий и любое случайное значение могут быть там, например 0
.
Решение этой проблемы было бы изменить код, чтобы printf("%f", y.beta + p->beta);
как указал chqrlie
Параметр '% d' должен быть'% f' – user3386109
спасибо, почему не% d работает? @ user3386109 – Noooor
@Nona:% d для цифр (целые числа),% f для поплавков. – user3813674