簡體   English   中英

為什么sprintf('%i',x)顯示科學計數法?

[英]Why does sprintf('%i', x) show scientific notation?

在Matlab R2015b中嘗試以下操作:

>> sprintf('%i\n',uint64(2)^62)
ans =
4611686018427387904 %// correct

>> sprintf('%i\n',uint64(2)^63)
ans =
9.223372e+18 %// why scientific notation?

在R2010b中,情況更糟:低至uint64(2)^31已經引起了這種現象:

>> sprintf('%i\n',uint64(2)^31)
ans =
2.147484e+009

為什么sprintf將科學符號與'%i''%d'格式說明符一起使用? 可以避免嗎?

對我來說,使用num2str代替sprintf並不是解決方案。 即使它確實避免了科學計數法,

>> num2str(uint64(2)^63)
ans =
9223372036854775808 %// correct

我需要使用sprintf因為num2str不支持“前導空格”格式說明符:

>> sprintf('% 25i\n',uint64(2)^62, uint64(2)^50)
ans =
      4611686018427387904
         1125899906842624 %// correct: leading spaces to give 25 characters for each number

>> num2str([uint64(2)^62;uint64(2)^50], '% 25i\n')
ans =
4611686018427387904
   1125899906842624 %// incorrect: no leading spaces

>> num2str(uint64(2)^50, '% 25i\n')
ans =
1125899906842624 %// incorrect: no leading spaces

看着這個問題 ,似乎MATLAB由於某種原因(可能是因為它期望%i提供一個有符號的整數,但您給它一個無符號的整數)卻將非常大的數字(2 ^ 63)視為float ,並將其轉換為科學計數法,這也是為什么如果編寫sprintf('%.18i\\n',bitshift(uint64(2),62))會導致精度下降的原因:

9.223372036854775800e+18 vs. 9223372036854775808

使用%u而不是%i似乎會產生正確的結果:

sprintf('%u\n',bitshift(uint64(2),62))

ans =

9223372036854775808

(在這種特定情況下使用bitshift更有意義)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM