作者poiuy777 (帅气又拉风)
看板MATLAB
标题Re: [讨论] 关於回圈累加
时间Sun Mar 23 20:00:14 2014
这题目很好玩
虽然我不是高手 但可以简单说明一下
手边没有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