【发布时间】:2015-11-06 22:30:24
【问题描述】:
在 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
【问题讨论】:
-
这是因为超出了最大整数大小(2^63-1 afaik)吗?
-
@Adriaan 不,这不可能是原因,因为最大值实际上是2^64-1
-
恕我直言,这听起来像是一个错误。
-
@rayryeng 另请参阅
num2str(rand(1,3) * 9999, '% 25.5e\n')的结果:空格左填充,除了第一个。也很奇怪 -
您是否尝试过
%u用于无符号整数?