我正在尝试打印该值:
(2^32 - 1) * (2^32 - 1)
在MATLAB中并显示全部20位数字。我试过了
fomat long
和
sprintf('%20d',ans)
这些都没有得到我想要的结果并打印出来:
1.844674406511962e+19
或其他相似之处。有什么建议吗?
答案 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