2012-01-28 4 views
3

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

/* 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)); 


} 
+8

Можете ли вы разместить свой код. – hmjd

+3

Без соответствующего кода это не может быть удовлетворительным. –

+0

sqrt никогда не возвращает отрицательные значения. Ваши проблемы очень глубокие. Тот факт, что вы не понимаете, что нам нужно, чтобы ваш код отвечал на это, является вашей основной проблемой. Надеюсь, вы не думаете, что компьютер может сделать то же самое! –

ответ

6

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

+0

Спасибо. Странно, что это останется незамеченным в учебнике. Я использовал% f, и теперь он отлично работает. – user994165

+0

Учебник не использовал бы% d для значения с плавающей запятой –

+0

@David: Вы действительно никогда не видели учебник, книгу и т. Д. Без единой опечатки/ошибки? Это происходит - действительно. – Artur

8

Возможно, это?

int number; 
double dblNumber = (double)number; 
+0

Это, действительно, то, как один преобразует число в двойное, но это не проблема афера. – Borealid

+8

Странно, название его вопроса было. Ну что ж. –

2

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() преобразуется в неявном вдвое, до тех пор, пока существует прототип в области видимости. Поскольку вы включили правильный заголовок, нет необходимости в явном преобразовании.

Смежные вопросы