String 为什么sprintf(';%i';,x)显示科学符号?

String 为什么sprintf(';%i';,x)显示科学符号?,string,matlab,printf,String,Matlab,Printf,在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

在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)视为
浮点
,并将其转换为科学符号,这也是为什么要编写
sprintf('.18i\n',位移位(uint64(2),62))
您最终会失去精度:

9.223372036854775800e+18 vs. 9223372036854775808
使用
%u
而不是
%i
似乎可以产生正确的结果:

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

ans =

9223372036854775808

(在这个特定场景中使用
bitshift
更有意义)

这是因为超过了最大整数大小(2^63-1 afaik)吗?@adrian不,这不可能是原因,因为最大值实际上听起来像一个bug IMHO。@rayryeng还看到了
num2str(rand(1,3)*9999,%25.5e\n'的结果)
:除第一个空格外,其余空格为空白。您尝试过无符号整数的
%u
吗?不仅仅是非常大–特别是临界值是
intmax('int64')
2^63-1
)。始终使用适当的格式说明符。