让MATLAB打印完整的2 ^ 64值

时间:2014-03-19 00:53:32

标签: matlab printing

我正在尝试打印该值:

(2^32 - 1) * (2^32 - 1)
在MATLAB中

并显示全部20位数字。我试过了

fomat long

sprintf('%20d',ans)

这些都没有得到我想要的结果并打印出来:

1.844674406511962e+19

或其他相似之处。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您希望%d将整数打印为整数是正确的,不需要精度或字段宽度规范,而不是指数表示法(%e)。 sprintf无法将此整数显示为整数的原因。这就是为什么(以及更多)。

sprintf documentation开始,这是%d指定的输出格式:

  

整数,签名; %d%i;   基数10

此处的关键字是已签名。此 指定以十进制(基数为10)表示法打印的整数,符号占用一位!您(和%d)可以用 64位有符号整数(即int64)表示的最大整数是 2^63-1 (查看intmax('int64'))。由于(2^32 - 1) * (2^32 - 1) > 2^63-1 sprintf会回归到指数表示法(%e。但是不要接受我的话:

>> sprintf('%d',uint64(2^63)-1)
ans =
9223372036854775807
>> sprintf('%d',uint64(2^63))
ans =
9.223372e+18

解决方案是使用无符号整数格式:%u

>> sprintf('%u',uint64(2^63))
ans =
9223372036854775808

使用(2^32 - 1) * (2^32 - 1),问题不那么微妙,但解决方案是相同的:

>> val = (2^32 - 1) * (2^32 - 1); % > 2^63-1
>> sprintf('%u',val)
ans =
18446744065119617024

这回答了这个问题,但这仍然是错误的。这次不是sprintf的错。双精度(64位)浮点数只能表示整数up to 2^53 而不会丢失精度 1 。由于MATLAB中的默认数据类型为double,因此val存储为double。为确保不会损失精度,请使用uint64类型:

>> valUI = uint64(2^32 - 1) * uint64(2^32 - 1)
>> sprintf('%u',valUI)
ans =
18446744065119617025

关闭。 double几乎幸运。

1 这个值2 ^ 53(或9,007,199,254,740,992)可由flintmax('double')验证。

答案 1 :(得分:1)

您必须提高精度,即格式规范中的.之后的数字:

sprintf('%.20d',ans)

答案 2 :(得分:0)

要关闭科学记数法,请尝试以下方法:

format long g