Конвертировать int в double - PullRequest
4 голосов
/ 28 января 2012

Я запустил эту простую программу, но когда я конвертирую из int в double, результат равен нулю. sqrt нулей отображает отрицательные значения. Это пример из онлайн-учебника, поэтому я не уверен, почему это происходит. Я пробовал в Windows и Unix.

/* Hello World program */

#include<stdio.h>
#include<math.h>

main()

{  int i;

   printf("\t Number \t\t Square Root of Number\n\n");

   for (i=0; i<=360; ++i)
        printf("\t %d \t\t\t %d \n",i, sqrt((double) i));


}

Ответы [ 3 ]

11 голосов
/ 28 января 2012

Может быть, это?

int number;
double dblNumber = (double)number;
7 голосов
/ 29 января 2012

Проблема заключается в неправильном использовании формата 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 (конечно, в шестнадцатеричном формате).

2 голосов
/ 29 января 2012

sqrt() возвращает значение типа double.Вы не можете напечатать такое значение с помощью спецификатора преобразования "%d".

Попробуйте воспользоваться одной из этих двух альтернатив

        printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */
        printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */

Аргумент i в sqrt() преобразуется вудваивается неявно, пока есть прототип в области видимости.Поскольку вы включили правильный заголовок, явного преобразования не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...