在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
答案 0 :(得分:2)
看this question,似乎是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
更有意义)