2012-01-28 200 views
3

我運行了這個簡單的程序,但是當我從int轉換爲double時,結果爲零。零的sqrt然後顯示負值。這是一個在線教程的例子,所以我不確定爲什麼會發生這種情況。我嘗試在Windows和Unix。將int轉換爲double

/* 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 2012-01-28 19:09:42

+3

如果沒有問題的代碼,這是無法回答有意義的。 – 2012-01-28 19:17:18

+0

sqrt永遠不會返回負值。你的問題非常深刻。事實上,你沒有意識到我們需要看你的代碼來回答這個問題是你的根本問題。我希望你不要以爲電腦可以這樣做! – 2012-01-28 19:26:03

回答

6

的問題是不正確地使用printf格式的 - 用%克/%f,而不是%d

順便說一句 - 如果你想知道在這裏做什麼你的代碼是一些簡略的說明,可以幫助您瞭解:

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

打印: 「4100」

single precision floating point encoding format。 (-1)^ 0 *(1 + fraction = 0)* 2 ^(exp = 130-127)= 2 * 3 = 8.0但是打印爲int看起來只有41000000(當然是十六進制)。

+0

謝謝。奇怪的是,這會在教程中被忽視。我用%f,現在工作正常。 – user994165 2012-01-28 20:37:19

+0

本教程不會使用%d作爲浮點值 – 2012-01-28 21:04:37

+0

@David:如果沒有一個錯字/錯誤,您是否真的沒有看過教程,書籍等?它發生 - 真的。 – Artur 2012-01-28 21:19:04

8

也許這樣?

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

事實上,這是如何將數字轉換爲雙精度的,但這不是提問者的問題。 – Borealid 2012-01-28 21:05:12

+8

奇怪的是,他的問題的標題是。好吧。 – 2012-01-28 22:34:35

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()被轉換成隱式地翻一番之一,只要存在範圍的原型。由於您包含正確的標題,因此不需要進行明確的轉換。