Проблема заключается в неправильном использовании формата PRINTF - используйте% г /% е вместо% г
КСТАТИ - если вам интересно, что ваш код сделал здесь некоторые сокращенная объяснение, которое может помочь вам в понимании:
Функция printf обработала ваш результат с плавающей точкой sqrt как целое. Подписанные целые числа без знака имеют свои базовые представления бит (проще говоря - это способ, которым они «закодированы» в памяти, регистры и т. Д.). Указав формат на printf, вы расскажете ему, как он должен расшифровать этот бит-шаблон в определенной области памяти/регистре (в зависимости от вызовов и т. Д.). Например:
unsigned int myInt = 0xFFFFFFFF;
printf("as signed=[%i] as unsigned=[%u]\n", myInt, myInt);
дает: "как знаковое = [- 1] в качестве знака = [4294967295]"
Один бит шаблон используется, но рассматривается как подписанный первым и неподписанных позже. То же самое относится к вашему коду. Вы сказали printf обработать битовый шаблон, который использовался для «кодирования» результата с плавающей запятой sqrt как целого. Смотрите это:
float myFloat = 8.0;
printf("%08X\n", *((unsigned int*)&myFloat));
печатает: "41000000"
Согласно single precision floating point encoding format. 8.0 - просто (-1)^0 * (1 + fraction = 0) * 2^(exp = 130-127) = 2 * 3 = 8,0, но напечатано как int, выглядит всего лишь 41000000 (hex конечно).
Можете ли вы разместить свой код. – hmjd
Без соответствующего кода это не может быть удовлетворительным. –
sqrt никогда не возвращает отрицательные значения. Ваши проблемы очень глубокие. Тот факт, что вы не понимаете, что нам нужно, чтобы ваш код отвечал на это, является вашей основной проблемой. Надеюсь, вы не думаете, что компьютер может сделать то же самое! –