Re: [討論] 關於迴圈累加

看板MATLAB作者 (帥氣又拉風)時間11年前 (2014/03/23 20:00), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
這題目很好玩 雖然我不是高手 但可以簡單說明一下 手邊沒有MATLAB 請容許我用C寫個程式來解釋 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { double a = 2, b = 0; int arr[] = {0,0,0,0,0,1,1,0,0,1,\ 1,0,0,1,1,0,0,1,1,0,\ 0,1,1,0,0,1,1,0,0,1,\ 1,0,0,1,1,0,0,1,1,0,\ 0,1,1,0,0,1,1,0,0,1,\ 1,1}; for(int i = 0; i < 52; ++i) { if(arr[i]) { b += pow(a, i*-1); } if(i == 50 || i == 51) { printf("[%d] %f \n", i+1, b); printf("%.20lf \n", b); } } system("pause"); return 0; } Output: [51] 0.050000 0.04999999999999982200 [52] 0.050000 0.05000000000000026600 其實這個問題能聯想到二進位就對了一半了 MATLAB宣告預設值都是double型態 8 bytes 64 bits 而double顯示小數點只有用到其中的52 bits 由上面程式看起來 0.05的表示 不是0000000000000000011001100110011001100110011001100110011001100110 就是0000000000000000011001100110011001100110011001100110011001100111 所以說 表面上的0.05並不是真正的0.0500000000000000000000000000... 而是一個趨近於0.05的近似直 從這裡看起來 系統似乎是用最後一個bit為0的數來當0.05 所以放大之後就是這樣的結果 但是你文章中說 1.300~01 這我就不知道如何解釋了 還是要有請高手來解答 希望這一篇能拋磚引玉 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.28.181
文章代碼(AID): #1JBipG1q (MATLAB)
文章代碼(AID): #1JBipG1q (MATLAB)