Проблема заключается в неправильном использовании формата printf - используйте% g /% f вместо% d
Кстати - если вам интересно, что ваш код сделал здесь, это краткое пояснение, которое может помочь вам в понимании:
Процедура printf обработала ваш результат с плавающей запятой sqrt как целое число. Знаковые, беззнаковые целые имеют свои базовые битовые представления (проще говоря - это способ, которым они «кодируются» в памяти, регистрах и т. Д.). Указывая формат для printf, вы сообщаете ему, как он должен расшифровывать этот битовый шаблон в определенной области памяти / регистре (зависит от соглашений о вызовах и т. Д.). Например:
unsigned int myInt = 0xFFFFFFFF;
printf( "as signed=[%i] as unsigned=[%u]\n", myInt, myInt );
дает: "as подписано = [- 1] as unsigned = [4294967295]"
Используется один битовый шаблон, но он обрабатывается как подписанный вначале, а не подписанный позже. То же относится и к вашему коду. Вы сказали printf обрабатывать битовый шаблон, который использовался для «кодирования» результата с плавающей запятой sqrt, как целое число. Смотрите это:
float myFloat = 8.0;
printf( "%08X\n", *((unsigned int*)&myFloat) );
отпечатки: "41000000"
Согласно формат кодирования с плавающей запятой одинарной точности .
8.0 - это просто (-1) ^ 0 * (1 + дробь = 0) * 2 ^ (exp = 130-127) = 2 * 3 = 8.0, но напечатано как int и выглядит как 41000000 (конечно, в шестнадцатеричном формате).