2011-08-29 39 views
1

下面是從我的終端打印輸出,當我創建兩個向量的向量。有誰知道第二次撥打ones()發出警告的原因,而第一次沒有?不明原因的警告創建矢量

>> p1 

p1 = 

    0.7000 

>> p2 

p2 = 

    0.3000 

>> whos p1 
    Name  Size   Bytes Class  Attributes 

    p1  1x1     8 double    

>> whos p2 
    Name  Size   Bytes Class  Attributes 

    p2  1x1     8 double    

>> N 

N = 

    100 

>> T1 = ones(N*p1,1); 
>> T2 = ones(N*p2,1); 
Warning: Size vector should be a row vector with integer elements. 
+0

相關問題:[關於浮點精度:爲什麼迭代次數不相等?](http://stackoverflow.com/questions/6477178/about-floating-point-precision-why-the-iteration-numbers- (也檢查鏈接的問題) – Amro

回答

5

是的,你可能會認爲100 * .3是一個整數,但它不是。這是因爲0.3在所使用的IEEE數字表示中並不像0.3那樣存儲。大多數這樣的十進制數字沒有完全表示。請記住,數字以二進制形式存儲。當你進入0.3到MATLAB什麼是存儲在真正的十進制表示是:

0.299999999999999988897769753748434595763683319091796875

這是接近0.3,但不完全如此。

http://www.mit.edu/~pwb/cssm/matlab-faq_toc.html

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

有時結果將變成是一個準確的整數。

+0

對不起,以恢復這樣一箇舊的帖子,但我怎麼能看到存儲在內存中的任何確切的十進制表示爲0.3?你是自己計算一下還是在Matlab中有一種方法來顯示它到這個精度水平? – user13267

+0

@ user13267 - 我使用我的HPF工具。它在文件交換中。但是你可以使用sprintf。例如,嘗試這樣的:的sprintf( '%0.55f',3。) – 2012-11-30 03:39:25

+0

>> sprintf的 ANS = 0.2999999999999999900000000000000000000000000000000000000 >>的sprintf(,0.3(,0.3 '%55F。') '%99F'。 ) ans = 0.2999999999999999900000000000000000000000000000000000000000000000000000000000000000000000000000000 – user13267