看板 b97902HW 關於我們 聯絡資訊
‧什麼是 double‧   double 也是一種資料型態,就如同熟悉的 int 一樣。不同的是,int 儲存整數資料 ,而 double 放浮點數(即有小數點)。使用上和 int 類似,唯 int 使用的 %d 必須改 為 %lf。這裡一併列出所有目前用過的資料型態該用的代碼當作復習: int→%d double→%lf long long→DevC++ 裡用 %I64d 批改娘及 ACM 用 %lld   最後補充一些厲害的用法,直接舉例說明: #include <cstdio> main(){ int a=38; double b=38.0; printf("%9d\n",a); // 38,即總位數 9 位 printf("%09d\n",a); //000000038,總位數 9 位,不足前方補 0 printf("%.3lf\n",b); //38.000 ,只印小數點後 3 位 printf("%9.3lf\n",b); // 38.000,含整數、小數點、小數共 9 位 printf("%09.3lf\n",b); //00038.000,共 9 位,不足前方補 0 } 提醒一下,諸如 %.3lf 這種都是四捨五入到小數點後三位。 ‧科學計號‧ (「^」為次方符號,10^5 = 100000)   1e9 = 10^9 1e4 = 10^4 1e-5 = 10^(-5) = 0.00001 1e-10 = 10^(-10) = 0.0000000001 ‧浮點數誤差‧   用到 double 時是無論如何都得提到浮點數誤差的,不過這裡只打算亂講。簡單來說 是這樣,當你放例如 5 在變數裡時,電腦有可能存 4.9999999999999999999999999999。 原則上是沒有差別,但有時候會造成影響。使徒三是個好例子,很多人寫一寫可能會發現 印出來的東西竟然有 -0.000,其原因正是因為變數值為像 -0.00000000000002147483647 這種後面接了一些怪東西的值(只是隨便打的)。因此輸出時認為它不是 0,而是一個很 小很小的負數,所以取 3 位小數時印出 -0.000。   解法方法很簡單,我們加一個很小很小又不至於太小的數給它,例如 1e-10。 -0.00000000000002147483647 +0.0000000001 ------------------------------ 0.00000000009997852516353   這樣一來,用 %.3lf 印出時,答案就會是 0.000 了。 ‧數學函式‧ (使用前需先 #include <math.h>) 首先,π = 2.0 * acos(0.0) = 3.1415926535897932384626433832795。 ↑這是確確實實的 0.0 而不是表情符號   sin()、cos() 等等函數傳入的參數必須使用弳度而非角度,轉換方法高中數學課應 有提過,總之:弳度 = 角度 * π / 180。 ‧結語‧   使徒三 Go。 其實寫這篇是因為大家都很厲害或是我很失敗,總之使徒一、二幾乎沒有人問我,讓 我有種青年失業的感覺,因此希望這能有任何一點點幫助。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.242.109
humanlin:很有幫助的~推~~ 09/30 20:13
penlininkshs:X長哭哭ˊˋ 可以只推最後一段嗎??加油 你還有174 09/30 21:40
iForests:= =........................... 09/30 21:42
r44: 推X長,大家快來問X長使徒怎麼x! 09/30 22:04
benck:超有幫助!! 如果本來沒有學過double 沒看這個的話... 09/30 22:21
benck:使徒三會出問題...(像我一樣= =) 09/30 22:21
LoganChien:#include <float.h> 之後,你可以用 DBL_MAX 代表極大 09/30 22:40
LoganChien:的值(double 可以表示的最大值) 09/30 22:40
LoganChien:檢查二個 double 是否相同,最好用下面的公式,以減少 09/30 22:48
LoganChien:意外。﹝誤差造成的﹞ 09/30 22:48
LoganChien:fabs(a - b) < DOUBLE_PRECISION_EPSILON 09/30 22:49
LoganChien:let DOUBLE_PRECISION_EPSILON = 1e-9. 09/30 22:49
godgunman:二樓X宇亂入 XDDDDD 09/30 22:54
benck:上面那六行看不懂耶 可以詳細解釋嗎 謝謝 09/30 22:56
rewqrewwq:想判斷a<b的話 用a+1e-9<b 確保a真的<b 而非誤差造成的 09/30 23:18
MacacaXDrz:為什麼是-9不是-10阿@@? 10/01 00:00
benck:樓上問了一個好問題,請強者來回答= = 10/01 00:02
LoganChien:第一個部分應該沒有問題吧?DBL_MAX, 很大的數字。 10/01 00:08
LoganChien:第二個部分,你寫 if (1.3 * 1.3 == 1.69) 就知道了 10/01 00:09
LoganChien:為什麼是 1e-9 呢?因為... 10/01 00:10
LoganChien:1. 單純的習慣,我也有看過有人用 1e-8, 1e-10 10/01 00:11
MacacaXDrz:我看錯了XD 10/01 00:12
LoganChien:2. (印象中) C++ 標準規定 double 最低精確度是 1e-9 10/01 00:12
iForests:感謝 LoganChien 和 rewqrewwq 兩位強者的補充 :) 10/01 01:29