Re: [討論] 關於迴圈累加
這題目很好玩
雖然我不是高手 但可以簡單說明一下
手邊沒有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
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
0
2
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章
7
20