[英]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.