3

我在使用 MATLAB 和 64 位整数时遇到了一些问题。我想要一个相当于 2^63-1 的掩码(除了 MSB 之外的所有掩码),但 MATLAB 似乎只是四舍五入。

>> mask_fraction = uint64(9223372036854775807)

mask_fraction = 9223372036854775808 % This is 2^63 again, not 2^63-1!

相似地,

  >> uint64(2^63)

    ans =  9223372036854775808       


    >> uint64(2^63-1)

    ans =  9223372036854775808

我的另一项尝试根本行不通:

>> uint64(2^63) - 1
??? Undefined function or method 'minus' for input arguments of type 'uint64'.

想法?

4

4 回答 4

4

@BasSwinckels 正确指出了一个问题。我再讲一个。

第一个不能精确表示的双精度浮点整数是2^53+1. 当您将表达式传递给uint64函数时,它们在被强制转换为 uint64 之前被评估为双精度值。如果这些表达式计算为不能精确表示的双精度整数,您将看到与您描述的行为类似。这正是uint64(2^63-1)uint64(2^63)两者都返回的原因9223372036854775808。2 的所有幂都可以安全地以双精度表示,所以uint64(2^63)-1或者uint64(2^63)-uint64(1)是你应该使用的(一旦你弄清楚你的其他问题)。

于 2013-08-04T20:23:10.123 回答
3

我没有看到你报告的问题。在我的电脑上(64 位 Ubuntu12.04 上的 Matlab R2012b):

>> mask_fraction = uint64(9223372036854775807)

mask_fraction =

  9223372036854775807

>> uint64(2^63) - 1

ans =

  9223372036854775807

您可能运行较旧的 Matlab 版本吗?

我还发现“未定义的函数或方法减去 ...”错误有点可疑。您是否将 uint64 别名为其他函数?先试试clear uint64...

于 2013-08-04T20:15:56.130 回答
1

我不知道您使用的 MATLAB 版本是否支持它,但这可能会有所帮助

mask_fraction = uint64(intmax('int64'))

返回

mask_fraction =
  9223372036854775807

2^63-1是 的最大值int64

于 2013-08-05T00:36:27.447 回答
1

从其他评论看来,Matlabminus在某些旧版本中没有实现类 uint64 的方法。以下丑陋的解决方法适用于 R2011b:

>> bitset(intmax('uint64'), 64, 0)

ans =

  9223372036854775807
于 2013-08-04T22:39:35.553 回答